У меня есть .pid
файл, и мне нужно проверить, запущен ли процесс. Пока я нашел два варианта
kill -0 `cat something.pid`
который выводит ошибку, если pid не запущен. Я знаю, что это может быть перенаправлено /dev/null
, но это заставляет меня думать, что это не лучшее решение.
Вторым решением будет использование ps
, которое также печатает на STDOUT
ps -ef `cat something.pid`
Это нормально, чтобы перенаправить вывод /dev/null
и просто использовать возвращенный код состояния, или это признак того, что я делаю что-то не так и мне нужна другая команда?
kill -0
как стандарт (POSIX) -совместимый.Ответы:
для большинства дистрибутивов linux перечисление / proc / {pid} является хорошим способом получения информации о запущенных процессах и обычно о том, как команды пользовательского пространства, такие как "ps", взаимодействуют с ядром. Так, например, вы можете сделать;
Изменить: вы должны проверить, что kpid установлен, но это более полезно, так как он вернет "не существует" для неустановленного $ {kpid}
источник
${kpid}
существуетКак отметил Андерс, вы должны использовать
kill -0
для соответствия POSIX.В системах Linux вы также можете проверить наличие файла в файловой системе / proc, например:
источник
Если это в сценарии (что, как я полагаю, имеет место в связи с тем, что вы беспокоитесь о печати на стандартный вывод), то вы могли бы сделать следующее:
В
ps -p
выглядит для процесса с PID , указанной в something.pid ($()
синтаксис немного более новая версия кавычки. Кавычка необходимо избежать при определенных обстоятельствах, новая форма не делает). Также2>&1
перенаправляет stderr для этой команды.Если
ps -p
команда не находит процесс с этим PID, она завершается с ошибкой> 0, и поэтомуelse
выполняется. В противном случаеkill
утверждение. Вы можете отрицать вышесказанное, если хотите:Надеюсь это ответит на твой вопрос. Очевидно, будьте осторожны и проверяйте много, используя опасные команды, такие как
kill
.источник
Вот несколько вариантов:
/etc/init.d/
) и используете дистрибутив на основе Debian, вам лучше использоватьstart-stop-daemon
: Вы должны получить код выхода 0, если он работает.procps
пакета:источник
Если у вас есть pid-файл, вы можете использовать pgrep, чтобы проверить, запущен ли процесс:
источник