Zasadniczo, jaki sygnał reprezentuje „0”, ponieważ tutaj widzę SYGNAŁY zaczynające się od 1.
kill 0
(bez myślnika), wyjaśnionego tutaj i tutaj .
Zasadniczo, jaki sygnał reprezentuje „0”, ponieważ tutaj widzę SYGNAŁY zaczynające się od 1.
kill 0
(bez myślnika), wyjaśnionego tutaj i tutaj .
Odpowiedzi:
wysłanie sygnału 0
do podanego PID
po prostu sprawdza, czy jakiś proces z podanym PID
jest uruchomiony i masz uprawnienia do wysłania do niego sygnału.
Aby uzyskać więcej informacji, zobacz następujące strony podręcznika:
zabić (1)$ man 1 kill
...
If sig is 0, then no signal is sent, but error checking is still performed.
...
zabić (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.
...
man 2 kill
zamiast tego.
man 1 kill
i man 2 kill
miałem to w moim systemie Fedora 20. Trudno to jednak zauważyć, zakopane w obu tych stronach podręcznika.
If sig is 0 (the null signal), error checking is performed but no signal is actually sent. The null signal can be used to check the validity of pid.
pubs.opengroup.org/onlinepubs/009695399/functions/kill.html
man 2 kill
jest poza pierwszą poprawką :)
... znalezienie dokumentacji dotyczącej tego specjalnego sygnału może być trudne. Pomimo tego, co powiedzieli inni, jedyna wzmianka o tym sygnale w man 1 kill
systemach opartych na Debianie to:
Szczególnie przydatne sygnały obejmują HUP, INT, KILL, STOP, CONT i 0.
Niezbyt pomocne, zwłaszcza jeśli jeszcze nie wiesz, co robi sygnał. Nie jest również wymieniony na liście wyników programu kill -l
, więc nie będziesz o tym wiedział, chyba że już o tym wiesz.
W systemach Debian i Ubuntu wynik polecenia man 2 kill
mówi po części:
Jeśli sig ma wartość 0, to żaden sygnał nie jest wysyłany, ale sprawdzanie błędów jest nadal wykonywane; można to wykorzystać do sprawdzenia istnienia identyfikatora procesu lub identyfikatora grupy procesów.
Możesz użyć, kill -0
aby sprawdzić, czy proces jest uruchomiony. Rozważ te przykłady.
# Kill the process if it exists and accepts signals from
# the current user.
sleep 60 &
pid=$!
kill -0 $pid && kill $pid
# Check if a PID exists. When missing, this should result
# in output similar to:
# bash: kill: (6228) - No such process
# Exit status: 1
kill -0 $pid; echo "Exit status: $?"
Możesz również użyć, kill -0
aby określić, czy bieżący użytkownik ma uprawnienia do sygnalizowania danego procesu. Na przykład:
# See if you have permission to signal the process. If not,
# this should result in output similar to:
# bash: kill: (15764) - Operation not permitted
# Exit status: 1
sudo sleep 60 &
kill -0 $!; echo "Exit status: $?"
kill(2)
Here's the snippet:The kill() function sends the signal specified by sig to pid, a process or a group of processes. Typically, Sig will be one of the signals specified in sigaction(2). A value of 0, however, will cause error checking to be performed (with no signal being sent). This can be used to check the validity of pid.
kill
stronie podręcznika : "Jeśli sig ma wartość 0, to żaden sygnał nie jest wysyłany, ale sprawdzanie błędów jest nadal wykonywane."
To polecenie sprawdza, czy proces z PID w $ pid jest aktywny.
$pid
może być uruchomiony, ale nie masz uprawnień do wysyłania do niego sygnału.
kill(1)
Wypisze inny błąd dla każdego. Dzięki temu możesz stwierdzić, czy pid żyje, niezależnie od tego, czy masz uprawnienia do wysyłania sygnałów, czy nie. Ponadto typowym użyciem kill -0
jest sprawdzenie, czy pid żyje, nawet jeśli nie zawsze jest używany poprawnie. Powiedziałbym, że ta odpowiedź jest poprawna (poza pisownią).
kill -0 $pid
będzie taka sama w obu przypadkach. Zwróci, 1
więc nie możesz powiedzieć bez analizy wyniku, kill
czy proces jest uruchomiony, czy nie, jeśli nie masz uprawnień do wysyłania do niego sygnału. EDYCJA: tak, wiem, że jest używana przez większość czasu do sprawdzania, czy proces jest aktywny, ale jest to błędne, chyba że możesz zagwarantować, że masz uprawnienia do wysyłania sygnału (np: bycie rootem)
kill
wbudowany bash (pytanie jest oznaczone bash
) podaje typ błędu na stderr i wskazanie błędu w kodzie powrotu. Oznacza to, że „To polecenie sprawdza [czy] istnieje proces z PID w $ pid” jest całkowicie poprawne, jeśli poprawnie zinterpretujesz dane wyjściowe. [Nie komentowałbym, gdybyś nie powiedział, że dałeś -1 do odpowiedzi. Twój komentarz jest ważny w inny sposób].
Kill -0 $ pid służy do sprawdzenia, czy proces z pid istnieje, czy nie.
Zachowaj ostrożność podczas używania polecenia „kill -0 $ pid”, aby sprawdzić istnienie procesu, ponieważ
Gdy zamierzony proces zakończy się, jego pid można przydzielić do innego nowo utworzonego procesu. (Więc nie można być tak pewnym, że dany proces jest aktywny, czy nie)
W przypadku procesu Zombie, na który dziecko czeka, aż rodzic zadzwoni. Tutaj trzyma $ pid i daje pozytywny wynik, gdy ten proces nie jest uruchomiony.
Zabij -0 $ pid używany do sprawdzenia, czy proces działający z $ pid istnieje, czy nie. Ale może to być trudne, ponieważ identyfikator procesu można ponownie przypisać po zakończeniu procesu i uruchomieniu nowego procesu. Można użyć killall -0, aby dowiedzieć się, czy dany proces jest uruchomiony, czy nie.
EXIT
sygnału lub 0
do procesu:stdout
sukcesie nie wyśle żadnych danych wyjściowych .stderr
jeśli coś jest nie tak.Mówiąc dokładniej, użyteczną funkcją dla twoich skryptów powłoki byłaby:
function isProcess ()
{
kill -s EXIT $1 2> /dev/null
}
To nie zwraca żadnego tekstu w stdout
przypadku sukcesu, ale komunikat o błędzie w stderr
przypadku niepowodzenia (ale przekierowałem ten komunikat o błędzie do/dev/null
).
Jeśli obawiasz się stanu procesu nieistniejącego / zombie , musisz użyć ps
, najlepiej z --no-headers
przełącznikiem.
#!/bin/ksh
function trim ()
{
echo -n "$1" | tr -d [:space:]
}
function getProcessStatus ()
{
trim $(ps -p $1 -o stat --no-headers)
}
function isZombie ()
{
typeset processStatus=$(getProcessStatus $1)
[[ "$processStatus" == "Z" ]]
return $?
}