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

Как правильно проверить, работает ли PID?

у меня есть .pid файл, и мне нужно проверить, запущен ли процесс. Пока нашел два варианта

kill -0 `cat something.pid`

который выводит ошибку, если pid не запущен. Я знаю, что это можно перенаправить на /dev/null, но это заставляет меня думать, что это не лучшее решение.

Второе решение - использовать ps, который, однако, также печатается на STDOUT

ps -ef `cat something.pid`

Нормально ли перенаправлять вывод на /dev/null и просто используйте возвращенный код состояния, или это признак того, что я делаю что-то не так и мне нужна другая команда?

для большинства дистрибутивов Linux перечисление / proc / {pid} - хороший способ получить информацию о запущенных процессах и обычно о том, как команды пользовательского пространства, такие как «ps», взаимодействуют с ядром. Так, например, вы можете сделать;

[ -d "/proc/${kpid}" ] && echo "process exists" || echo "process not exists"

Изменить: вы должны проверить, установлен ли kpid, но это более полезно, поскольку оно вернет "не существует" для неустановленного $ {kpid}

[ -n "${kpid}" -a -d "/proc/${kpid}" ] && echo "process exists" || echo "process not exists"

Как заметил Андерс, вам следует использовать kill -0 для соответствия POSIX.

В системах Linux вы также можете проверить наличие файла в файловой системе / proc, например,

-f /proc/$(cat something.pid)/status

Если это в сценарии (что, как я предполагаю, так и есть, поскольку вы беспокоитесь о печати в стандартный вывод), то вот как вы могли бы это сделать:

if ps -p $(cat something.pid) > /dev/null 2>&1
then
    kill $(cat something.pid)
else
    # Deal with the fact that the process isn't running
    # i.e. clear up the pid file
fi

В ps -p ищет процесс с pid, указанным в something.pid ( $() синтаксис - это немного более новая версия обратной кавычки. При определенных обстоятельствах обратная кавычка требует экранирования, чего не делает новая форма). В 2>&1 перенаправляет stderr и для этой команды.

Если ps -p команда не находит процесс с этим PID, она завершается с ошибкой> 0, поэтому else будет казнен. В противном случае kill заявление. Вы можете опровергнуть сказанное выше, если хотите:

if ! ps -p ...

Надеюсь это ответит на твой вопрос. Очевидно, будьте осторожны и много проверяйте при использовании опасных команд, таких как kill.

Вот несколько вариантов:

  • Если вы пишете сценарий инициализации (например, тот, который нужно поместить в /etc/init.d/), а если вы используете дистрибутив на основе Debian, вам лучше использовать start-stop-daemon:
    # start-stop-daemon -T -p $PIDFILE -u $USER_NAME -n $NAME
    Вы должны получить код выхода 0, если он работает.
  • Вы можете использовать pgrep и pkill из procps пакет:
    pgrep --pidfile $PIDFILE

Если у вас есть файл pid, вы можете использовать pgrep, чтобы проверить, запущен ли процесс:

    if pgrep -F something.pid; then
        echo "Running"
    else
        echo "Not running"
    fi