Często podczas pracy w konsoli wykonujemy kilka rzeczy naraz. Czytamy stronę podręcznika man, edytujemy jakiś plik, słuchamy muzyki, bądź po prostu wpisujemy różne komendy. Ludzie mają w nawyku otwieranie osobnego okna, bądź zakładki terminala dla każdego programu. Tymczasem zapomina się, że jedna powłoka może uruchomić kilka programów naraz. Jedynym ograniczeniem, jakie na nas nakłada jest to, że tylko jeden program może działać na pierwszym planie. Reszta działa w tle, albo jest zatrzymana.
Kontrolowanie zadań najłatwiej jest zademonstrować na przykładzie. Załóżmy, że chcemy poprawić nasz plik konfiguracyjny /etc/X11/xorg.conf. Do tego potrzebujemy dokumentacji/manuala, edytora tekstu. Z czasem może nam się przydać przeglądarka. Mając otwartą jedną sesję terminala, jesteśmy w stanie obsłużyć wszystkie te programy i dodatkowo wydawać standardowe polecenia, takie jak cd, ls, czy grep. Zatem do dzieła!
Uruchamiamy najpierw stronę maualakaw@mercury ~ $ man xorg.conf
Zapoznajemy się z tekstem. Jeśli wiemy już, co chcemy zmienić, możemy zastopować proces man. Wciskamy Ctrl+z i otrzymujemy coś takiego:[1]+ Stopped man xorg.conf
Zatrzymane zadanie zwolniło nam prompt. Nie dość, że możemy wpisywać polecenia, to jeszcze system operacyjny nie przydziela temu procesowi czasu procesora. Coprawda man nie jest programem, który wyraźnie obciąża system, ale w ten sam sposób możemy zatrzymywać zadania, które potrzebują sporo mocy obliczeniowej.
W naszej konsoli mamy zatrzymane jedno zadanie. Możemy teraz otworzyć edytor i zmienić coś w pliku:kaw@mercury ~ $ sudo emacs /etc/X11/xorg.conf
Po naniesieniu zmian, zatrzymujemy edytor, wciskając Ctrl+z. Możemy podejżeć, jakie zadania mamy obecnie pod kontrolą:kaw@mercury ~ $ jobs
[1]- Stopped man xorg.conf
[2]+ Stopped sudo emacs /etc/X11/xorg.conf
Widać, że dwa procesy są zatrzymane. Jeśli chcemy któreś z tych zadań zadań przywołać na pierwszy plan (ang. foreground), to możemy użyć polecenia fg. Przyjmuje ono jako parametr nazwę programu, albo numer zadania. Zatem jeśli chcemy doczytać coś w manualu, to wydajemy któreś z poleceń:fg man
fg 1
Wywołanie fg bez argumentów spowoduje uruchomienie ostatnio zatrzymanego zadania.
Podobnie, jak wywoływać zadania na pierwszy plan, możemy im rozkazać, aby działały w tle (ang. background). Zrobimy to poleceniem bg. Jest to użyteczne, kiedy np. uruchamiamy z konsoli jakąś aplikację okienkową i zapominamy dodać znaczka `&’ na końcu polecenia, który uruchamia aplikację domyślnie w tle. Zatem, jeśli uruchomimy przeglądarkę na pierwszym planie, stracimy możliwość wpisywania innych poleceń. Aby ją wysłać w tło, musimy ją najpierw zatrzymać.kaw@mercury ~ $ firefox
No running windows found
[3]+ Stopped firefox
Zatrzymaliśmy firefoksa, coprawda możemy wpisywać polecenia, ale w przeglądarce niewiele możemy zrobić. Nie reaguje ona na żadne zdarzenia. Dlatego przełączamy ją, żeby działała w tlekaw@mercury ~ $ bg
[3]+ firefox &
Teraz po podejżeniu naszych zadań widać, że mamy uruchomione w powłoce trzy procesy – dwa zatrzymane i jeden działający w tle:kaw@mercury ~ $ jobs
[1]+ Stopped man xorg.conf
[2] Stopped sudo emacs /etc/X11/xorg.conf
[3]- Running firefox &
Polecenie bg może przyjmować takie same argumenty jak fg, czyli nazwę programu, bądź numer zadania.
Dodatkowym ułatwieniem może się okazać możliwość obserwowania ilości zadań, jakie dana powłoka ma „pod sobą”. Wystarczy zmodyfikować nieco nasz prompt:kaw@mercury ~/job $ export PS1="[j] $PS1"
[0] kaw@mercury ~/job $ # Zwróc uwagę na numer, jaki się pojawił przed nazwą użytkownika
[0] kaw@mercury ~/job $ man bash
[1]+ Stopped man bash
[1] kaw@mercury ~/job $ man ls
[2]+ Stopped man ls
[2] kaw@mercury ~/job $ jobs
[1]- Stopped man bash
[2]+ Stopped man ls
[2] kaw@mercury ~/job $
Do promptu został dołączony numerek, który się zmienia wraz z ilością zadań, które są zatrzymane, bądź działają w tle. Jest to spore ułatwienie przy zarządzaniu zadaniami.
Podsumowanie
Nasza praca może się okazać dużo bardziej efektywna, jeśli się nauczymy obsługiwać wiele zadań w jednej powłoce. Wystarczy pewnego dnia postanowić sobie, że w czasie pracy będzie się miało uruchomioną tylko jedno okno/zakładkę terminala. Trochę czasu upłynie, ale z czasem przyzwyczaimy się do nowego stylu pracy. Wystarczy, że za każdym razem przed uruchomieniem nowego okna/zakładki, pomyślimy chwilę, czy nie wystarczy nam do tego jedna powłoka?
Mógłbyś jeszcze dodać tekst odnośnie zamykania konsoli, bez zamykania aplikacji w niej uruchomionych.
W skrócie: Robi się to za pomocą polecenia nohup.
Najlepiej nohup program –lista –argumentów > /dev/null &
Jeśli nie interesuje nas, co dany programy wypisuje, przekierowujemy jego wyjście do jakiegoś pliku. Znaczek `&’ oznacza, że uruchamiamy go od razu w tle.
Tak uruchomiony program będzie działał po zamknięciu terminala, nawet po wyloowaniu! Tak więc należy uważać, co w ten sposób uruchamiamy.
Warto też dodać w tym miejscu coś nie coś o screen’ie.
Za pomocą screena możemy wygodnie uruchamiać kupę różnych programów, przełączać się między nimi dowolnie a do tego bez problemu zapamiętywać sesję screena i wracać do niej jak będzie taka potrzeba.
Pozdro
Bardzo dobry tekst. Po przeczytaniu wyłączyłe Tab Bar w Yakuake’u . :))
[quote comment=”2228″]Warto też dodać w tym miejscu coś nie coś o screen’ie.[/quote]Raczej nie. Dzięki screenowi możesz uruchamiać kilka powłok naraz. Podobnie, jak możesz otwierać wiele tabów w graficznych emulatorach terminala. Chodziło mi o to, żeby wykorzystać jedną otwartą sesję do kontrolowania wielu zadań.
Ja do wyłączania terminala ( bez zamykania otwartych zadań ) używam polecenia exit. Prostsze i szybsze.