Job control

Funkcja powłoki pozwalająca wstrzymywać, wznawiać i przenosić polecenia między pierwszym planem a tłem. Obsługiwana komendami takimi jak fg, bg i jobs.

Job control (kontrola zadań) to mechanizm powłoki (np. Bash czy Zsh), który pozwala Ci zarządzać wieloma poleceniami w obrębie jednej sesji terminala: wstrzymywać je, wznawiać oraz przerzucać między pierwszym planem (foreground) a tłem (background). Dzięki temu nie musisz otwierać nowego okna terminala za każdym razem, gdy długo działające polecenie zablokuje Ci prompt. Każde uruchomione polecenie powłoka traktuje jako tzw. job i przypisuje mu numer, którym potem operujesz.

Sednem są tu dwa stany. Proces w foreground zajmuje terminal i odbiera Twoje znaki z klawiatury, więc póki działa, prompt jest niedostępny. Proces w background działa równolegle i oddaje Ci terminal do dalszej pracy. Powłoka pilnuje, które zadanie jest aktywne, zatrzymane czy działa w tle, i tym właśnie steruje job control.

Jak to działa w praktyce

Najprostszy scenariusz: odpaliłeś coś, co trwa dłużej niż chciałeś — na przykład tar -czf backup.tar.gz /var/www. Zamiast czekać z założonymi rękami, wciskasz Ctrl+Z. To wysyła sygnał SIGTSTP i wstrzymuje zadanie (status stopped). Teraz odzyskujesz prompt. Wpisujesz bg, żeby wznowić to zadanie w tle, i archiwizacja leci dalej, a Ty robisz swoje. Gdy będziesz chciał je z powrotem na wierzch, wpisujesz fg.

Podstawowe komendy:

  • jobs — pokazuje listę zadań sesji z ich numerami i statusem;
  • fg %1 — przenosi zadanie numer 1 na pierwszy plan;
  • bg %1 — wznawia wstrzymane zadanie w tle;
  • polecenie & — uruchamia polecenie od razu w tle, np. ./skrypt.sh &.

Na co uważać

Najczęstsza pułapka: zamykasz terminal i dziwisz się, że proces w tle padł. W typowej konfiguracji zadania są przypięte do sesji powłoki i dostają SIGHUP przy jej zakończeniu. Jeśli proces ma przeżyć wylogowanie, użyj nohup polecenie & albo wyjmij job z tablicy przez disown. Druga sprawa: Ctrl+Z to nie to samo co Ctrl+C — pierwsze wstrzymuje (proces nadal istnieje i zżera zasoby), drugie wysyła SIGINT i zwykle kończy program. Pamiętaj też, że proces w tle, który próbuje czytać z terminala, sam się zatrzyma i będzie czekał na fg.

Do poważniejszego zarządzania długimi sesjami i tak sięgniesz po tmux lub screen — job control sprawdza się głównie do szybkiego żonglowania zadaniami tu i teraz.

Pojęcia powiązane: foreground i background, sygnały (SIGTSTP, SIGINT, SIGHUP), nohup, disown, tmux, screen, proces, shell.