Назад | Перейти на главную страницу

Linux: как определить смерть процесса?

Я хотел бы обнаружить, что какой-то процесс в 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 в качестве второго аргумента.