Linux - uruchamianie zadań w tle




Terminal w linux'ie jest potężnym narzędziem. Choć niepozorny i strasznie wyglądający, daje ogromne możliwości obsługi systemu pod każdym kątem. Poniżej przybliżę Wam troszeczke obsługę procesów. Z doświadczenia wiem, że mimo prostej tematyki, obsługa procesów i uruchamianie ich w tle nie jednemu sprawiła nieco problemów. Zaczniemy od prostych mechanizmów, a skończymy na nieco bardziej skomplikowanych. Zapraszam do lektury :)


& czyli narzędzie do uruchomienia procesu w tle

Znak & dodany na końcu polecenia powoduje uruchomienie procesu w tle. Jest to bardzo przydatna funkcja chociażby ze względu na to, że każdy program, którego wykonanie zajmuję zauważalną chwilę blokuje nam dostęp do terminala. Dodanie & na końcu komendy daje nam możliwość kontunuowania pracy. W poniższym przykładzie użyję polecenia sleep. Polecenie to powoduje uśpienie / przerwę na zadany czas. W naszym przypadku będzie to 15 sekund. Komenda wykonana bez uruchamiania w tle zabierze nam dostęp do terminala na 15 sekund. Gdy uruchomimy polecenie w tle to będziemy mogli dalej pracować w terminalu.

sleep 15 &
[1] 31592

Na ekran dostaliśmy informację zwrotną.
[1] - informacja o numerze zadania wykonywanego w tle w danej chwili. Numery są nadawane kolejno począwszy od numeru 1.
31592 - jest to w naszym przypadku PID procesu.

sleep 20 &
[2] 1061
[1]   Done                    sleep 15

W kolejnym przykładzie możemy zaobserwować, że kolejny proces uruchomiony przez nas dostał już numerek 2, a system poinformował nas o zakończeniu sie procesu z numerem 1.


Polecenie wait

Przy omawianiu uruchamiania poleceń w tle warto wspomnieć o poleceniu wait. Polecenie wait uruchomione bez parametrów oczekuje na zakończenie wszystkich sesji programów uruchomionych w tle.

sleep 15 &
[4] 3348
sleep 10 &
[5] 3388
wait
[4]-  Done                    sleep 15
[5]+  Done                    sleep 10

Po uruchomieniu polecenia wait terminal będzie czekał póki wszystkie polecenia uruchomione w tle się nie zakończą. W momencie zakończenia danego polecenia będzie wyświetlana informacja o tym fakcie na ekranie. Polecenie wait może także m.in. przyjąć parametr w postaci numeru PID danego procesu. Będzie wtedy oczekiwało zakończenia tylko procesu o danym numerze. Jeżeli jakis proces zakończy się przed naszym to także dostaniemy o tym informację. Więcej informacji o tym poleceniu możecie znaleźć w manualu linux'a wydając polecenie man wait.

sleep 25 &
[1] 5883
sleep 20 &
[2] 5896
sleep 30 &
[3] 5915
wait 5896
[2]-  Done                    sleep 20

Obsługa procesów w tle

Jako, że polecenia uruchomione w tle sa dla nas niewidoczne, to warto wiedzieć jak podejrzeć taką listę procesów. Służy do tego polecenie jobs. Pokazuje aktualnie wykonujące się polecenia w tle wraz z identyfikatorami.

sleep 25 &
[1] 15848
sleep 20 &
[2] 15870
sleep 30 &
[3] 15884
jobs
[1]   Running                 sleep 25 &
[2]-  Running                 sleep 20 &
[3]+  Running                 sleep 30 &

Co do bieżących procesów to możemy także troche namieszać skrótami klawiatury. Przykładowo przy procesie który nie został uruchomiony w tle i blokuje nam dostęp do terminala można zastosować kombinację <ctrl + z>, która usypia bieżacy proces i automatycznie pryenosi je w tło. Można także być bardziej brutalnym i zastosować kombinacje <ctrl + c>, która przerwie dzałanie bieżącego procesu.

sleep 30
^Z[1]  Stopped                 sleep 30
jobs
^Z[1]  Stopped                 sleep 30

No ok, ale co z poleceniami, które są zatrzymane w tle i ciągle wiszą w pamięci. Czy można zrobic cos by je przywrócić lub uruchomić? To z pomoca przychodzą polecenia fg i bg.
fg - przenosi proces z tła na pierwszy plan.
bg - przenosi uśpiony proces w tło i go uruchamia.

jobs
^Z[1]  Stopped                 sleep 30
bg %1
^Z[1]+ sleep 30 &
jobs
^Z[1]+  Done                   sleep 30

W powyższym przykładzie możemy zobaczyć, że po uzyciu polecenia bg z identyfikatorem procesu, proces został wznowiony w tle i dobiegł do końca. Polecenie fg działa analogicznie z tą różnicą, że proces jest przenoszony na pierwszy plan, czyli blokuje nam terminal. Jeżeli chcemy ubić proces mozna zastosowac także polecenie kill. Przy jego pomocy także możemy stopowac i wznawiać procesy, ale o tym w innym artykule.
Polecenia fg i bg przyjmują parametry w postaci:
PID - identyfikator procesu
%id_job - identyfikator zlecenia
%% lub %+ - bieżące zlecenie
%- - poprzednie zlecenie
%command - zlecenie z określoną komendą
%?string - zlecenie z ciągiem znaków.


Polecenie nohup

Pracując z procesami prędzej czy później dojdziemy do sytuacji, w której uruchomilismy czasochłonny proces w tle, a wylogowując się proces został ubity razem z naszą sesją terminalową. Aby tego uniknąć stosujemy polecenie nohup. Jest to polecenie unix'owe przeznaczone dokładnie do tego typu sytuacji. Wylogowanie z systemu nie powoduje przerwania zadań wykonywanych wkontekście naszego użytkownika. Stosujemy go w połaczeniu ze znakiem &, czyli uruchamianiem w tle.

nohup sleep 50 &
[1] 32349

Mam nadzieję, że tematyka procesów i ich działania w tle została wyczerpująco opisana. W przyszłości opiszę jeszcze jedno potężne narzędzie o nazwie screen, ale to jest temat na oddzielny artykuł. W przypadku pytań / wątpliwości służę pomocą.
Aktualizacja (09-08-2016): Artykuł screen jest już dostępny.