В основном, какой сигнал представляет «0», потому что здесь я вижу числа СИГНАЛА, начинающиеся с 1.
Ответы:
отправка сигнала 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
странице руководства : «Если sig равен 0, то сигнал не отправляется, но проверка ошибок по-прежнему выполняется».
Эта команда проверяет, жив ли процесс с PID в $ pid.
$pid
может работать, но у вас нет разрешения на отправку ему сигнала.
kill(1)
каждого будет напечатана отдельная ошибка. Таким образом, вы можете определить, жив ли pid, независимо от того, есть ли у вас разрешения на отправку сигналов или нет. Кроме того, типичное использование kill -0
- проверить, жив ли pid, даже если он не всегда используется правильно. Я бы сказал, что это правильный ответ (не считая орфографии).
kill -0 $pid
будет одинаковым в обоих случаях. Он вернется, 1
поэтому вы не можете сказать без анализа вывода, kill
запущен процесс или нет, если у вас нет разрешения на отправку ему сигнала. РЕДАКТИРОВАТЬ: да, я знаю, что большую часть времени он используется для проверки, жив ли процесс, но это неверно, если вы не можете гарантировать, что у вас есть разрешение на отправку сигнала (например, root)
kill
встроенный bash (вопрос помечен bash
) выводит тип ошибки на stderr и индикацию ошибки в его коде возврата. То есть, «Эта команда проверяет, [жив ли] ли процесс с PID в $ pid» полностью верна, если вы правильно интерпретируете вывод. [Я бы не стал комментировать, если бы вы не сказали, что дали -1 к ответу. В остальном ваш комментарий действителен].
Kill -0 $ pid - проверить, существует ли процесс с pid.
Будьте осторожны при использовании kill -0 $ pid для проверки существования процесса, потому что
Как только запланированный процесс завершится, его pid может быть выделен другому вновь созданному процессу. (Так что нельзя быть уверенным в том, что конкретный процесс жив или нет)
В случае процесса зомби, для которого дочерний элемент ожидает вызова от родителя wait. Здесь он удерживает $ 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 $?
}