Я хотел бы обнаружить, что какой-то процесс в Linux умер. Скажите, что идентификатор этого процесса 1234
. Я могу проверить, что его pid используется, проверив наличие /proc/1234/
. Тем не менее, возможно, что процесс остановился и pid был повторно использован. Я могу проверить, есть ли inode
некоторого файла в процессе (скажем proc/1234/cmdline
) то же самое и надеемся, что новый процесс получит другую ценность.
Есть ли лучший способ надежно обнаружить смерть процесса?
Вы можете разобрать /proc/%d/stat
который, если PID в настоящее время существует, предоставит вам информацию о процессе. Это будет работать в любой системе Linux, но не в других системах UNIX.
Чтобы проанализировать файл, найдите последний )
персонаж. За ним следует пробел и текущее состояние процесса. Может быть, вас не волнует состояние, может быть, вам все равно, Z
что означает, что процесс мертв, но родительский процесс еще не получил статус.
В 19 полях дальше в данные вы найдете время начала процесса. Если PID был повторно использован, время начала изменилось. Вот пример командной строки, которая напечатает только время начала:
cat /proc/2272/stat | sed -e 's/.*) //' | cut -f20 -d' '
если вы знаете, что процесс называется по имени, вы можете просто
ps aux | grep <name> | grep -v grep
Не уверен, что это то, что вы ищете, но именно так я интерпретировал ваш вопрос.
На самом деле вы можете объединить два. Если вы знаете имя процесса и pid, который он использовал изначально, pgrep вернет список pid для процесса, и вы можете проверить.
#!/bin/bash
PIDS=`pgrep $1`
for PID in ${PIDS[@]}
do
if [ "$2" == "${PID}" ]
then
echo "Still running!"
exit 1
fi
done
echo "Not found"
exit 0
Передайте имя процесса в качестве первого аргумента и PID в качестве второго аргумента.