Co robi 'kill -0 $pid' w skrypcie powłoki?

Zasadniczo, jaki sygnał reprezentuje '0', ponieważ tutaj widzę numery sygnałów zaczynające się od 1.

Author: gjain, 2012-06-13

6 answers

Wysyłanie sygnału 0 do podanego PID sprawdza tylko, czy jakiś proces z podanym PID jest uruchomiony i masz pozwolenie na wysłanie sygnału do niego.

Więcej informacji można znaleźć na następujących stronach manpages:

kill(1)
$ man 1 kill
...
If sig is 0, then no signal is sent, but error checking is still performed.
...
kill(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.
...
 116
Author: dwalter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-21 22:18:17

To jest dobre pytanie, ponieważ...

...może być ciężko znaleźć dokumentację tego specjalnego sygnału. Pomimo tego, co powiedzieli inni, jedyną wzmianką o tym sygnale w man 1 kill w systemach opartych na Debianie jest:

Szczególnie przydatne sygnały obejmują HUP, INT, KILL, STOP, CONT i 0.

[9]}niezbyt pomocny, zwłaszcza jeśli nie wiesz jeszcze, co robi sygnał. Nie jest również wymieniony przez wyjście kill -l, więc nie będziesz o tym wiedział, chyba że już o tym wiem.

Gdzie go znaleźć

W systemach Debian i Ubuntu wyjście man 2 kill mówi częściowo:

Jeśli sig jest równe 0, to nie jest wysyłany żaden sygnał, ale sprawdzanie błędów jest nadal wykonywane; może to być użyte do sprawdzenia istnienia ID procesu lub grupy procesów.

Do czego to jest dobre

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 do określ, 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: $?"
 119
Author: Todd A. Jacobs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-23 14:31:15

To polecenie sprawdza czy proces z PID w $pid jest żywy.

 6
Author: Fritz G. Mehner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-13 10:11:55

Kill -0 $pid polega na sprawdzeniu czy proces z pid istnieje czy nie.

Bądź ostrożny używając 'kill -0 $pid' aby sprawdzić istnienie procesu, ponieważ

  1. Po zakończeniu zamierzonego procesu jego pid może być przypisany do innego nowo utworzonego procesu. ( Więc nie można być pewnym, że dany proces jest żywy lub nie)

  2. W przypadku procesu Zombie, na który dziecko czeka aż rodzic wywoła wait. Tutaj trzyma $pid i daje pozytywne wynik, gdy ten proces nie jest uruchomiony.

 2
Author: Sandeep_black,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-26 11:12:11

Http://djangstorm.com/Content/kill.html . Sprawdzanie błędów, tutaj odnosi się do uprawnień dostępnych do wykonania polecenia przez użytkownika.

 1
Author: Rane,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-12 02:21:21

Kill -0 $pid używany do sprawdzania, czy proces z $pid jest żywy, czy nie. Ale może to być trudne, ponieważ identyfikator procesu może być ponownie przypisany po zakończeniu procesu i uruchomieniu nowego procesu. Można użyć killall -0, aby dowiedzieć się, czy dany proces jest uruchomiony, czy nie.

 1
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-11 05:20:08