Szukaj…


Lista aktualnych ofert pracy

$ tail -f /var/log/syslog > log.txt
[1]+  Stopped                 tail -f /var/log/syslog > log.txt

$ sleep 10 &

$ jobs
[1]+  Stopped                 tail -f /var/log/syslog > log.txt
[2]-  Running                 sleep 10 &

Obsługa zadań

Tworzenie miejsc pracy

Aby utworzyć zadanie, po prostu dodaj jedno & po poleceniu:

$ sleep 10 &
[1] 20024

Możesz również uczynić z uruchomionego procesu zadanie, naciskając Ctrl + z :

$ sleep 10
^Z
[1]+  Stopped                 sleep 10

Tło i pierwszy plan procesu

Aby przenieść proces na pierwszy plan, używana jest komenda fg wraz z %

$ sleep 10 &
[1] 20024

$ fg %1
sleep 10

Teraz możesz wchodzić w interakcje z procesem. Aby przywrócić go do tła, możesz użyć polecenia bg . Z powodu zajętej sesji terminala musisz najpierw zatrzymać proces, naciskając Ctrl + z .

$ sleep 10
^Z
[1]+  Stopped              sleep 10

$ bg %1
[1]+ sleep 10 &

Ze względu na lenistwo niektórych Programistów, wszystkie te polecenia działają również z jednym % jeśli jest tylko jeden proces lub dla pierwszego procesu na liście. Na przykład:

$ sleep 10 &
[1] 20024

$ fg %        # to bring a process to foreground 'fg %' is also working.
sleep 10

Lub tylko

$ %           # laziness knows no boundaries, '%' is also working.
sleep 10

Dodatkowo, wpisanie fg lub bg bez żadnego argumentu obsługuje ostatnie zadanie:

$ sleep 20 &
$ sleep 10 &
$ fg
sleep 10
^C
$ fg
sleep 20

Zabijanie uruchomionych zadań

$ sleep 10 &
[1] 20024

$ kill %1
[1]+  Terminated              sleep 10

Proces uśpienia działa w tle z identyfikatorem procesu (pid) 20024 i numerem zadania 1 . Aby odwołać się do procesu, możesz użyć numeru pid lub numeru zadania. Jeśli używasz numeru zadania, musisz poprzedzić go % . Domyślnym sygnałem zabicia wysyłanym przez kill jest SIGTERM , który pozwala procesowi docelowemu wyjść z gracją.

Niektóre typowe sygnały zabicia pokazano poniżej. Aby zobaczyć pełną listę, uruchom kill -l .

Nazwa sygnału Wartość sygnału Efekt
SIGHUP 1 Rozłącz
SIGINT 2 Przerwij z klawiatury
SIGKILL 9 Sygnał zabicia
SIGTERM 15 Sygnał zakończenia

Rozpocznij i zabij określone procesy

Prawdopodobnie najłatwiejszym sposobem na zabicie uruchomionego procesu jest wybranie go poprzez nazwę procesu, jak w poniższym przykładzie za pomocą polecenia pkill jako

pkill -f test.py

(lub) bardziej niezawodny sposób przy użyciu pgrep do wyszukiwania rzeczywistego identyfikatora procesu

kill $(pgrep -f 'python test.py')

Ten sam wynik można uzyskać za pomocą grep ps -ef | grep name_of_process a następnie zabicie procesu związanego z wynikowym pid (id procesu). Wybór procesu przy użyciu jego nazwy jest wygodny w środowisku testowym, ale może być naprawdę niebezpieczny, gdy skrypt jest używany w środowisku produkcyjnym: jest praktycznie niemożliwe, aby mieć pewność, że nazwa będzie pasować do procesu, który chcesz zabić. W takich przypadkach poniższe podejście jest w rzeczywistości dużo bezpieczniejsze.

Uruchom skrypt, który ostatecznie zabije, stosując następujące podejście. Załóżmy, że polecenie, które chcesz wykonać i ostatecznie zabić, to python test.py

#!/bin/bash

if [[ ! -e /tmp/test.py.pid ]]; then   # Check if the file already exists
    python test.py &                   #+and if so do not run another process.
    echo $! > /tmp/test.py.pid
else
    echo -n "ERROR: The process is already running with pid "
    cat /tmp/test.py.pid
    echo
fi

Spowoduje to utworzenie pliku w katalogu /tmp zawierającego pid procesu python test.py . Jeśli plik już istnieje, zakładamy, że polecenie już działa, a skrypt zwraca błąd.

Następnie, jeśli chcesz go zabić, użyj następującego skryptu:

#!/bin/bash

if [[ -e /tmp/test.py.pid ]]; then   # If the file do not exists, then the
    kill `cat /tmp/test.py.pid`      #+the process is not running. Useless
    rm /tmp/test.py.pid              #+trying to kill it.
else
    echo "test.py is not running"
fi

który zabije dokładnie proces związany z twoją komendą, bez polegania na jakichkolwiek ulotnych informacjach (takich jak łańcuch użyty do uruchomienia komendy). Nawet w tym przypadku, jeśli plik nie istnieje, skrypt zakłada, że chcesz zabić niedziałający proces.

Ten ostatni przykład można łatwo ulepszyć, uruchamiając wielokrotnie to samo polecenie (na przykład dołączając do pliku pid zamiast go nadpisując) i zarządzając przypadkami, w których proces umiera przed zabiciem.

Wymień wszystkie procesy

Istnieją dwa typowe sposoby wyświetlania wszystkich procesów w systemie. Oba wyświetlają wszystkie procesy uruchomione przez wszystkich użytkowników, chociaż różnią się formatem, który generują (przyczyny różnic są historyczne).

ps -ef   # lists all processes 
ps aux   # lists all processes in alternative format (BSD)

Można to wykorzystać do sprawdzenia, czy dana aplikacja działa. Na przykład, aby sprawdzić, czy serwer SSH (sshd) jest uruchomiony:

ps -ef | grep sshd

Sprawdź, który proces działa na określonym porcie

Aby sprawdzić, który proces działa na porcie 8080

lsof -i :8080

Znajdowanie informacji o uruchomionym procesie

ps aux | grep <search-term> pokazuje procesy pasujące do wyszukiwanego terminu

Przykład:

root@server7:~# ps aux | grep nginx
root       315  0.0  0.3 144392  1020 ?        Ss   May28   0:00 nginx: master process /usr/sbin/nginx
www-data  5647  0.0  1.1 145124  3048 ?        S    Jul18   2:53 nginx: worker process
www-data  5648  0.0  0.1 144392   376 ?        S    Jul18   0:00 nginx: cache manager process
root     13134  0.0  0.3   4960   920 pts/0    S+   14:33   0:00 grep --color=auto nginx
root@server7:~#

Tutaj druga kolumna to identyfikator procesu. Na przykład, jeśli chcesz zabić proces nginx, możesz użyć polecenia kill 5647 . Zawsze zaleca się używanie polecenia kill z SIGTERM zamiast SIGKILL .

Odrzucanie pracy w tle

$ gzip extremelylargefile.txt &
$ bg
$ disown %1

Pozwala to na kontynuowanie długotrwałego procesu po zamknięciu powłoki (terminalu, ssh itp.).



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow