у меня есть .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, если он работает.procps
пакет:pgrep --pidfile $PIDFILE
Если у вас есть файл pid, вы можете использовать pgrep, чтобы проверить, запущен ли процесс:
if pgrep -F something.pid; then
echo "Running"
else
echo "Not running"
fi