Відповіді:
відправлення сигналу 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 $?
}