Ten jest trochę trudny do zdobycia, ale jeśli spojrzysz na następujące 2 strony podręcznika, zobaczysz następujące uwagi:
kill (1)
$ man 1 kill
...If sig is 0,then no signal is sent, but error checking is still performed....
zabij (2)
$ man 2 kill
...If sig is 0,then no signal is sent, but error checking is still performed;
this can be used to check for the existence of a process ID or process
group ID....
Zatem sygnał 0 w rzeczywistości nie wyśle niczego do PID twojego procesu, ale sprawdzi, czy masz do tego uprawnienia.
Gdzie może to być przydatne?
Jednym oczywistym miejscem byłoby, gdybyś próbował ustalić, czy masz uprawnienia do wysyłania sygnałów przez uruchomiony proces kill. Możesz sprawdzić przed wysłaniem właściwego killsygnału, owijając czek, aby upewnić się, że kill -0 <PID>był on najpierw dozwolony.
Przykład
Załóżmy, że proces był uruchamiany przez użytkownika root w następujący sposób:
$ sudo sleep 2500&[1]15693
Teraz w innym oknie, jeśli uruchomimy to polecenie, możemy potwierdzić, że działa PID.
$ pgrep sleep
15693
Spróbujmy teraz tego polecenia, aby sprawdzić, czy mamy dostęp do wysyłania sygnałów PID za pośrednictwem kill.
Więc to działa, ale wynik przecieka komunikat z killpolecenia, że nie mamy uprawnień. Nic wielkiego, po prostu złap STDERR i wyślij go na adres /dev/null.
Dodałbym również, że można tego użyć w skryptach wieloprocesowych, aby sprawdzić, czy proces jest nadal aktywny.
prateek61
1
@slm nice find. Używam teraz tej logiki w skrypcie, który piszę, dzięki.
111 ---
12
Prateek61 ma rację. Nie możesz używać pgrep, psparsować ani test -e /proc/$PIDw przenośnych skryptach, ale kill -0działa wszędzie. Jeśli otrzymasz identyfikator PID, który może być nieaktualny - np. /var/runWpis - jest to przenośny sposób sprawdzenia, czy proces nadal trwa.
Warren Young,
1
Oprócz informowania Cię, czy PID żyje, skutecznie informuje również, czy nadal uruchamia proces z Twojego UID, ponieważ nie masz uprawnień do wysyłania sygnałów do innych UID (chyba że jesteś rootem). To sprawia, że wyniki fałszywie dodatnie z powodu ponownego użycia PID są mniej prawdopodobne.
Barmar
Niepowodzenie kill -0 $(pgrep sleep)może niekoniecznie oznaczać , że jesteś słaby , zwróci fałsz, jeśli nie sleepuruchomi się żadna komenda, lub jeśli jest więcej niż jedna i jest jedna, której nie możesz zabić, lub jeśli jeden ze snów umrze między pgrep a zabiciem uruchamiane polecenia.
Stéphane Chazelas
22
kill -0(lub jego bardziej przenośny wariant POSIX kill -s 0) przechodzi przez proces wysyłania sygnału, ale tak naprawdę go nie wysyła. Jest to funkcja bazowego C API, którą polecenie powłoki ujawnia w prosty sposób.
kill -s 0 -- "$pid"testuje zatem, czy istnieje uruchomiony proces z danym PID (lub PGID, jeśli $pidjest ujemny) i czy bieżący proces będzie miał pozwolenie na wysłanie (dowolnego z procesów w grupie procesów w przypadku ujemnej $pid) sygnału. Jest to głównie sposób na sprawdzenie, czy proces (lub grupa procesów) żyje.
Należy pamiętać, że nawet jeśli jest uruchomiony proces z oczekiwanym PID i uprawnieniami, niekoniecznie jest to oczekiwany proces. Możliwe, że proces, którego się spodziewasz, umarł wcześniej, a jego PID został ponownie wykorzystany do niezwiązanego procesu. Właściwy sposób monitorowania procesów polega na tym, że pozwala to ich rodzicowi - PID procesu nie jest ponownie wykorzystywany, dopóki jego rodzic nie potwierdzi śmierci (dlatego istnieją zombie ), więc rodzic procesu może niezawodnie zidentyfikować swoje dzieci na podstawie ich PID.
blok ... do something ...jest wykonywany, jeśli proces z przechowywanym PID /path/to/file.pidjest uruchomiony - i - o ile fragment kodu nie działa jako root - jeśli PID działa z tym samym użytkownikiem.
Standard POSIX określa rolę 0sygnału:
Jeśli sig wynosi 0 (sygnał zerowy), sprawdzanie błędów jest wykonywane, ale w rzeczywistości żaden sygnał nie jest wysyłany. Sygnał zerowy może być użyty do sprawdzenia ważności pid.
(kill (3p), POSIX.1-2008 - podobne sformułowanie w POSIX.1-2001)
Zauważ, że POSIX określa oba style kill -0i kill -s 0style wiersza poleceń (kill (1p)).
W przeciwieństwie do interfejsu kill syscall, killpolecenia nie można użyć do wiarygodnego sprawdzenia istnienia PIDów należących do innych użytkowników (jako zwykły użytkownik), np .:
$ kill -0123
kill: kill 123 failed: no such process
$ echo $?1
trap
poleceniem Basha a 0 w stosunku do sygnału 0 zkill
: Co to jest sygnał 0 w poleceniu pułapki?kill -0 $pid
skrypt powłoki? oraz Co właściwie robi kill 0? .Odpowiedzi:
Ten jest trochę trudny do zdobycia, ale jeśli spojrzysz na następujące 2 strony podręcznika, zobaczysz następujące uwagi:
kill (1) zabij (2)Zatem sygnał 0 w rzeczywistości nie wyśle niczego do PID twojego procesu, ale sprawdzi, czy masz do tego uprawnienia.
Gdzie może to być przydatne?
Jednym oczywistym miejscem byłoby, gdybyś próbował ustalić, czy masz uprawnienia do wysyłania sygnałów przez uruchomiony proces
kill
. Możesz sprawdzić przed wysłaniem właściwegokill
sygnału, owijając czek, aby upewnić się, żekill -0 <PID>
był on najpierw dozwolony.Przykład
Załóżmy, że proces był uruchamiany przez użytkownika root w następujący sposób:
Teraz w innym oknie, jeśli uruchomimy to polecenie, możemy potwierdzić, że działa PID.
Spróbujmy teraz tego polecenia, aby sprawdzić, czy mamy dostęp do wysyłania sygnałów PID za pośrednictwem
kill
.Więc to działa, ale wynik przecieka komunikat z
kill
polecenia, że nie mamy uprawnień. Nic wielkiego, po prostu złap STDERR i wyślij go na adres/dev/null
.Kompletny przykład
Więc moglibyśmy zrobić coś takiego
killer.bash
:Teraz, gdy uruchomię powyższe jako użytkownik inny niż root:
Jednak gdy jest uruchamiany jako root:
źródło
pgrep
,ps
parsować anitest -e /proc/$PID
w przenośnych skryptach, alekill -0
działa wszędzie. Jeśli otrzymasz identyfikator PID, który może być nieaktualny - np./var/run
Wpis - jest to przenośny sposób sprawdzenia, czy proces nadal trwa.kill -0 $(pgrep sleep)
może niekoniecznie oznaczać , że jesteś słaby , zwróci fałsz, jeśli niesleep
uruchomi się żadna komenda, lub jeśli jest więcej niż jedna i jest jedna, której nie możesz zabić, lub jeśli jeden ze snów umrze między pgrep a zabiciem uruchamiane polecenia.kill -0
(lub jego bardziej przenośny wariant POSIXkill -s 0
) przechodzi przez proces wysyłania sygnału, ale tak naprawdę go nie wysyła. Jest to funkcja bazowego C API, którą polecenie powłoki ujawnia w prosty sposób.kill -s 0 -- "$pid"
testuje zatem, czy istnieje uruchomiony proces z danym PID (lub PGID, jeśli$pid
jest ujemny) i czy bieżący proces będzie miał pozwolenie na wysłanie (dowolnego z procesów w grupie procesów w przypadku ujemnej$pid
) sygnału. Jest to głównie sposób na sprawdzenie, czy proces (lub grupa procesów) żyje.Należy pamiętać, że nawet jeśli jest uruchomiony proces z oczekiwanym PID i uprawnieniami, niekoniecznie jest to oczekiwany proces. Możliwe, że proces, którego się spodziewasz, umarł wcześniej, a jego PID został ponownie wykorzystany do niezwiązanego procesu. Właściwy sposób monitorowania procesów polega na tym, że pozwala to ich rodzicowi - PID procesu nie jest ponownie wykorzystywany, dopóki jego rodzic nie potwierdzi śmierci (dlatego istnieją zombie ), więc rodzic procesu może niezawodnie zidentyfikować swoje dzieci na podstawie ich PID.
źródło
kill -0 $pid
Informuje, czy z procesem$pid
istnieje.We fragmencie
blok
... do something ...
jest wykonywany, jeśli proces z przechowywanym PID/path/to/file.pid
jest uruchomiony - i - o ile fragment kodu nie działa jako root - jeśli PID działa z tym samym użytkownikiem.Standard POSIX określa rolę
0
sygnału:(kill (3p), POSIX.1-2008 - podobne sformułowanie w POSIX.1-2001)
Zauważ, że POSIX określa oba style
kill -0
ikill -s 0
style wiersza poleceń (kill (1p)).W przeciwieństwie do interfejsu kill syscall,
kill
polecenia nie można użyć do wiarygodnego sprawdzenia istnienia PIDów należących do innych użytkowników (jako zwykły użytkownik), np .:vs.
Podczas wywoływania funkcji kill syscall można niezawodnie rozróżnić te przypadki, patrząc na
errno
wartość (por. Np. Przykład w języku Python ).źródło