Bash
Zadania i procesy
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.).