Jak uruchamiać i kontrolować procesy w tle w systemie Linux

Użyj powłoki Bash w systemie Linux do zarządzania procesami pierwszego planu i tła. Możesz użyć funkcji i sygnałów kontroli zadań Bash, aby zapewnić większą elastyczność w wykonywaniu poleceń. Pokażemy Ci, jak to zrobić.

Wszystko o procesach

Za każdym razem, gdy program jest wykonywany w systemie operacyjnym Linux lub Unix-podobnym, uruchamiany jest proces. „Proces” to nazwa wewnętrznej reprezentacji wykonywanego programu w pamięci komputera. Dla każdego aktywnego programu istnieje proces. W rzeczywistości istnieje proces dla prawie wszystkiego, co jest uruchomione na twoim komputerze. Obejmuje to komponenty twojego graficzne środowisko graficzne (GDE), takie jak GNOM lub KDEi system demony które są uruchamiane podczas uruchamiania.

Dlaczego prawie wszystko, co działa? Cóż, wbudowane Bash, takie jak Płyta CD, pwd, i Alias nie muszą mieć uruchomionego (lub „spawnowanego”) procesu, gdy są uruchamiane. Bash wykonuje te polecenia w instancji powłoki Bash uruchomionej w oknie terminala. Te polecenia są szybkie właśnie dlatego, że nie muszą mieć uruchomionego procesu, aby je wykonać. (Możesz wpisać help w oknie terminala, aby zobaczyć listę wbudowanych Bash).

Procesy mogą działać na pierwszym planie, w takim przypadku przejmują one twój terminal, dopóki nie zostaną ukończone, lub mogą być uruchamiane w tle. Procesy działające w tle nie dominują w oknie terminala i można w nim kontynuować pracę. A przynajmniej nie dominują w oknie terminala, jeśli nie generują danych wyjściowych na ekranie.

Brudny przykład

Zaczniemy prosty ping śledzenie przebiegu. Zamierzamy wysłać ping do domeny newsblog.pl. To zostanie wykonane jako proces pierwszoplanowy.

ping www.newsblog.pl.com

ping www.howtogeek.com w oknie terminala

Otrzymujemy oczekiwane rezultaty, przewijając okno terminala. Nie możemy nic zrobić w oknie terminala, gdy działa ping. Aby zakończyć polecenie, naciśnij Ctrl + C.

Ctrl+C

pingowanie danych wyjściowych śledzenia w oknie terminala

Widoczny efekt Ctrl + C jest podświetlony na zrzucie ekranu. ping wyświetla krótkie podsumowanie, a następnie zatrzymuje się.

Powtórzmy to. Ale tym razem uderzymy Ctrl + Z zamiast Ctrl + C. Zadanie nie zostanie zakończone. Będzie to zadanie w tle. Otrzymujemy kontrolę nad zwróconym nam oknem terminala.

ping www.newsblog.pl.com
Ctrl+Z

efekt Ctrl + Z na polecenie uruchomione w oknie terminala

Widoczny efekt wciśnięcia Ctrl + Z jest zaznaczony na zrzucie ekranu.

Tym razem dowiadujemy się, że proces został zatrzymany. Zatrzymany nie oznacza zakończony. To jak samochód na znaku stop. Nie złomowaliśmy go i nie wyrzuciliśmy. Nadal jest w drodze, nieruchomy, czeka na wyjazd. Proces jest teraz pracą w tle.

Polecenie pracy wyświetli listę ofert pracy które zostały uruchomione w bieżącej sesji terminala. A ponieważ zadania są (nieuchronnie) procesami, do ich wyświetlenia możemy również użyć polecenia ps. Użyjmy obu poleceń i porównajmy ich wyniki. Użyjemy opcji T (terminal), aby wyświetlić tylko procesy uruchomione w tym oknie terminala. Pamiętaj, że nie ma potrzeby używania łącznika – z opcją T.

jobs
ps T

Jobs w oknie terminala

Polecenie jobs mówi nam:

[1]: Liczba w nawiasach kwadratowych to numer zlecenia. Możemy użyć tego do odniesienia się do zadania, gdy musimy go kontrolować za pomocą poleceń kontroli zadań.
+: Znak plus + wskazuje, że jest to zadanie, które zostanie wykonane, jeśli użyjemy polecenia kontroli zadań bez określonego numeru zadania. Nazywa się to pracą domyślną. Zadaniem domyślnym jest zawsze to, które zostało ostatnio dodane do listy zadań.
Zatrzymano: proces nie działa.
ping www.newsblog.pl.com: wiersz poleceń, który uruchomił proces.

Polecenie ps mówi nam:

PID: identyfikator procesu procesu. Każdy proces ma unikalny identyfikator.
TTY: pseudotype (okno terminala), z którego został wykonany proces.
STAT: stan procesu.
CZAS: ilość czasu procesora zużywanego przez proces.
COMMAND: Polecenie, które uruchomiło proces.

Oto typowe wartości dla kolumny STAT:

D: Nieprzerwany sen. Proces jest w stanie oczekiwania, zwykle oczekuje na wejście lub wyjście i nie można go przerwać.
I: Idle.
R: Bieganie.
S: Przerywany sen.
T: Zatrzymany przez sygnał sterujący pracą.
Z: Proces zombie. Proces został zakończony, ale nie został „wyczyszczony” przez swój proces nadrzędny.

Po wartości w kolumnie STAT można umieścić jeden z tych dodatkowych wskaźników:

<: high-priority="" task="" nice="" to="" other="" processes="" n:="" low-priority="" l:="" process="" has="" pages="" locked="" into="" memory="" used="" by="" real-time="" s:="" a="" session="" leader.="" leader="" is="" that="" launched="" groups.="" shell="" multi-thread="" process.="" foreground="">Widzimy, że Bash ma stan Ss. Wielkie „S” oznacza, że ​​powłoka Bash śpi i jest przerywana. Odpowiedzi, gdy tylko będziemy go potrzebować. Małe litery „s” oznaczają, że powłoka jest liderem sesji.

Polecenie ping ma stan T. To mówi nam, że ping został zatrzymany przez sygnał sterujący zadaniem. W tym przykładzie był to Ctrl + Z, którego użyliśmy do umieszczenia go w tle.

Polecenie ps T ma stan R, co oznacza działanie. Znak + wskazuje, że ten proces jest członkiem grupy pierwszego planu. Tak więc polecenie ps T działa na pierwszym planie.

Polecenie bg

Polecenie bg służy do wznowienia procesu w tle. Może być używany z numerem zlecenia lub bez niego. Jeśli używasz go bez numeru zadania, domyślne zadanie zostanie przeniesione na pierwszy plan. Proces nadal działa w tle. Nie możesz przesłać do niego żadnych danych wejściowych.

Jeśli wydamy polecenie bg, wznowimy nasze polecenie ping:

bg

bg w oknie terminala

Polecenie ping zostaje wznowione i ponownie widzimy przewijane dane wyjściowe w oknie terminala. Wyświetlana jest nazwa polecenia, które zostało ponownie uruchomione. Jest to zaznaczone na zrzucie ekranu.

wznowiono proces pingowania w tle z wyjściem w oknie terminala

Ale mamy problem. Zadanie działa w tle i nie przyjmuje danych wejściowych. Jak więc to zatrzymać? Ctrl + C nic nie robi. Widzimy to, kiedy go wpisujemy, ale zadanie w tle nie otrzymuje tych naciśnięć klawiszy, więc pinguje wesoło.

Zadanie w tle ignorujące Ctrl + C w oknie terminala

W rzeczywistości jesteśmy teraz w dziwnym trybie mieszanym. Możemy pisać w oknie terminala, ale to, co piszemy, jest szybko usuwane przez przewijane wyjście polecenia ping. Wszystko, co piszemy, ma skutek na pierwszym planie.

Aby zatrzymać nasze zadanie w tle, musimy przenieść je na pierwszy plan, a następnie zatrzymać.

Polecenie fg

Polecenie fg przeniesie zadanie w tle na pierwszy plan. Podobnie jak polecenie bg, można go używać z numerem zadania lub bez niego. Używanie go z numerem pracy oznacza, że ​​będzie działać na określonym stanowisku. Jeśli jest używany bez numeru zadania, używane jest ostatnie polecenie wysłane w tle.

Jeśli wpiszemy fg, nasze polecenie ping zostanie przeniesione na pierwszy plan. Znaki, które wpisujemy, są pomieszane z danymi wyjściowymi polecenia ping, ale są obsługiwane przez powłokę tak, jakby były normalnie wpisywane w wierszu poleceń. I faktycznie, z punktu widzenia powłoki Bash, właśnie tak się stało.

fg

Polecenie fg zmieszane z wyjściem polecenia ping w oknie terminala

A teraz, gdy ponownie mamy polecenie ping uruchomione na pierwszym planie, możemy użyć Ctrl + C, aby je zabić.

Ctrl+C

Ctrl + C zatrzymanie polecenia ping w oknie terminala

Musimy wysłać właściwe sygnały

To nie było całkiem ładne. Najwyraźniej uruchamianie procesu w tle działa najlepiej, gdy proces nie generuje danych wyjściowych i nie wymaga wprowadzania danych.

Ale niechlujny czy nie, nasz przykład się udał:

Umieszczanie procesu w tle.
Przywracanie procesu do stanu działania w tle.
Przywracanie procesu na pierwszy plan.
Zakończenie procesu.

Używając Ctrl + C i Ctrl + Z, wysyłasz sygnały do ​​procesu. To są skrótowe sposoby użycia polecenia kill. Tam są 64 różne sygnały to zabójstwo może wysłać. Użyj kill -l w wierszu poleceń, aby je wyświetlić. kill nie jest jedynym źródłem tych sygnałów. Część z nich jest podnoszona automatycznie przez inne procesy w systemie

Oto niektóre z najczęściej używanych.

SIGHUP: Sygnał 1. Automatycznie wysyłany do procesu, gdy terminal, w którym działa, jest zamknięty.
SIGINT: Sygnał 2. Wysłano do procesu, który został naciśnięty Ctrl + C. Proces zostaje przerwany i nakazuje zakończenie.
SIGQUIT: Sygnał 3. Wysyłane do procesu, jeśli użytkownik wyśle ​​sygnał zakończenia Ctrl + D.
SIGKILL: Sygnał 9. Proces jest natychmiast przerywany i nie będzie próbował się zamknąć. Proces nie przebiega wdzięcznie.
SIGTERM: Sygnał 15. Jest to domyślny sygnał wysyłany przez kill. Jest to standardowy sygnał zakończenia programu.
SIGTSTP: Sygnał 20. Wysyłane do procesu, gdy używasz Ctrl + Z. Zatrzymuje proces i umieszcza go w tle.

Musimy użyć polecenia kill, aby wydać sygnały, które nie mają przypisanych kombinacji klawiszy.

Dalsza kontrola pracy

Proces przeniesiony w tło za pomocą Ctrl + Z zostaje zatrzymany. Musimy użyć polecenia bg, aby ponownie uruchomić go. Uruchomienie programu jako działającego procesu w tle jest proste. Dołącz znak ampersand & na końcu wiersza poleceń.

Chociaż najlepiej jest, aby procesy działające w tle nie zapisywały się w oknie terminala, użyjemy przykładów, które to robią. Musimy mieć na zrzutach ekranu coś, do czego możemy się odwołać. To polecenie uruchomi niekończącą się pętlę jako proces w tle:

podczas gdy prawdziwe; wykonaj echo „newsblog.pl Loop Process”; spać 3; Gotowe &

podczas gdy prawdziwe;  czy echo

Otrzymujemy numer zadania i identyfikator procesu procesu. Nasz numer zlecenia to 1, a identyfikator procesu to 1979. Możemy użyć tych identyfikatorów do sterowania procesem.

Wyjście z naszej nieskończonej pętli zaczyna pojawiać się w oknie terminala. Tak jak poprzednio, możemy korzystać z wiersza poleceń, ale wszelkie polecenia, które wydajemy, są przeplatane danymi wyjściowymi z procesu pętli.

ls

dane wyjściowe procesu pętli w tle przeplatane danymi wyjściowymi innych poleceń

Aby zatrzymać nasz proces, możemy użyć Jobs, aby przypomnieć sobie, jaki jest numer zadania, a następnie użyć funkcji kill.

jobs zgłasza, że ​​nasz proces to zadanie numer 1. Aby użyć tego numeru z zakończeniem, musimy poprzedzić go znakiem procentu%.

jobs
kill %1

Jobs i zabij% 1 w oknie terminala

kill wysyła sygnał SIGTERM numer 15 do procesu i jest przerywany. Po następnym naciśnięciu klawisza Enter zostanie wyświetlony stan zadania. Wymienia proces jako „zakończony”. Jeśli proces nie reaguje na polecenie kill, możesz go nieco zwiększyć. Użyj kill z SIGKILL, sygnał numer 9. Po prostu wstaw liczbę 9 między komendą kill a numerem zadania.

kill 9 %1

Rzeczy, które omówiliśmy

Ctrl + C: Wysyła SIGINT, sygnał 2, do procesu – jeśli przyjmuje dane wejściowe – i nakazuje mu zakończenie.
Ctrl + D: Wysyła SISQUIT, sygnał 3, do procesu – jeśli przyjmuje dane wejściowe – i nakazuje mu zakończenie.
Ctrl + Z: Wysyła SIGSTP, sygnał 20, do procesu i nakazuje mu zatrzymanie (zawieszenie) i przejście do procesu w tle.
Jobs: Wyświetla listę zadań w tle i pokazuje ich numer.
bg job_number: Ponownie uruchamia proces w tle. Jeśli nie podasz numeru zadania, zostanie użyty ostatni proces, który został przekształcony w zadanie w tle.
fg job_number: przenosi proces w tle na pierwszy plan i uruchamia go ponownie. Jeśli nie podasz numeru zadania, zostanie użyty ostatni proces, który został przekształcony w zadanie w tle.
Commandline &: Dodanie znaku & na końcu wiersza poleceń powoduje wykonanie tego polecenia jako zadania w tle, które jest uruchomione.
kill% job_number: Wysyła SIGTERM, sygnał 15, do procesu, aby go zakończyć.
kill 9% job_number: Wysyła SIGKILL, sygnał 9, do procesu i przerywa go nagle.