Відповіді:
відправлення сигналу 0даному PIDпросто перевіряє, чи PIDзапущений якийсь процес із заданим , і у вас є дозвіл на надсилання сигналу на нього.
Для отримання додаткової інформації дивіться наступні вказівки:
вбити (1)$ man 1 kill
...
If sig is 0, then no signal is sent, but error checking is still performed.
...
вбити (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замість цього.
man 1 killі man 2 killінше було в моїй системі Fedora 20. Але важко помітити, поховані в обох сторінках.
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знаходиться за межами 1-ї поправки :)
... важко знайти документацію на цей спеціальний сигнал. Незважаючи на те, що інші сказали, в man 1 killсистемах, що базуються на Debian, цей сигнал згадується лише :
Особливо корисні сигнали включають HUP, INT, KILL, STOP, CONT та 0.
Не особливо корисно, особливо якщо ви вже не знаєте, що робить сигнал. Він також не перерахований за результатами kill -l, тому ви не будете знати про нього, якщо ви вже не знаєте про нього.
Про системи Debian і Ubuntu, висновок man 2 kill, частково:
Якщо sig дорівнює 0, то сигнал не надсилається, але перевірка помилок все одно виконується; це можна використовувати для перевірки наявності ідентифікатора процесу або ідентифікатора групи процесів.
Ви можете kill -0перевірити, чи працює процес. Розглянемо ці приклади.
# 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: $?"
Ви також kill -0можете визначити, чи має поточний користувач права сигналізувати про певний процес. Наприклад:
# 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) ось фрагменті: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сторінці man: "Якщо sig 0, то сигнал не надсилається, але перевірка помилок все ще виконується."
Ця команда перевіряє, чи процес PID у $ pid живий.
$pidможе працювати, але ви не маєте дозволу надсилати сигнал на нього.
kill(1)друку буде надруковано різну помилку для кожного. Таким чином, ви можете сказати, чи живе підсистема живої, незалежно від того, у вас є дозволи на надсилання сигналів чи ні. Крім того, типовим способом використання kill -0є те, щоб перевірити, чи живий підривник, навіть якщо він не завжди використовується правильно. Я б сказав, що ця відповідь правильна (крім написання).
kill -0 $pidне буде однаковим в обох випадках. Він повернеться, 1тому ви не зможете сказати, не аналізуючи вихід, killпроцес запущений чи ні, якщо ви не маєте дозволу надсилати йому сигнал. EDIT: так, я знаю, що він використовується в більшості випадків для перевірки, чи процес живий, але це неправильно, якщо ви не зможете гарантувати, що у вас є дозвіл на надсилання сигналу (наприклад: root)
killвбудований bash (питання позначено тегом bash) видає тип помилки на stderr та вказівку помилки у зворотному коді. Тобто, "Ця команда перевіряє [чи] процес з PID в $ pid живий" є цілком правильним, якщо ви правильно інтерпретуєте вихід. [Я б не коментував, якби ти не сказав, що ти дав -1 відповіді. Ваш коментар дійсний].
Kill -0 $ pid - це перевірити, чи існує процес з pid чи ні.
Будьте обережні, використовуючи "kill -0 $ pid", щоб перевірити існування процесу, оскільки
Після виходу із запланованого процесу, його під може бути виділений іншим новоствореним процесом. (Тож не можна бути таким впевненим, що певний процес живий чи ні)
У разі зомбі-процесу, для якого дитина чекає батька на дзвінок, чекайте. Тут він утримує $ pid і дає позитивний результат, поки цей процес не працює.
Убийте -0 $ pid, який використовується для перевірки, чи процес, який працює з $ pid, живий чи ні. Але це може бути складним, оскільки ідентифікатор процесу може бути перепризначений, як тільки процес завершиться і новий процес запуститься. Можна використовувати killall -0, щоб зрозуміти, чи працює певний процес чи ні.
EXITсигналу або 0процесу буде:stdoutПісля успіху він не надсилатиме жодного результату .stderrякщо щось невірно.Більш чітко, корисною функцією для ваших скриптів оболонки буде:
function isProcess ()
{
kill -s EXIT $1 2> /dev/null
}
Це не повертає текст stdoutпісля успіху, а повідомлення про помилку stderrпісля відмови (але я перенаправив це повідомлення про помилку /dev/null).
Якщо вас турбує стан неіснуючого / зомбі-процесу , тоді вам потрібно скористатися ps, бажано, --no-headersперемикачем.
#!/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 $?
}