У меня есть сценарий /etc/init.d/myservice
инициализации для инициализации службы, как это:
...
start() {
...
daemon /usr/sbin/myservice
...
}
stop() {
...
pgrep myservice
pidof myservice
ps -ef | grep myservice
...
}
И когда я пытаюсь остановить службу, это вывод:
10000 10001
10000
root 10000 1 0 09:52 ? 00:00:02 /usr/sbin/myservice
root 9791 9788 0 10:06 pts/1 00:00:00 /bin/sh /sbin/service myservice stop
root 10001 9791 1 10:06 pts/1 00:00:00 /bin/sh /etc/init.d/myservice stop
root 9805 9796 0 10:06 pts/1 00:00:00 grep myservice
Это ожидается? Почему pidof
возвращается только правильный PID службы, которую я хочу остановить, и pgrep
возвращает PID службы и PID сценария инициализации? Могу ли я рассчитывать на то, pidof
что всегда будет игнорировать PID из сценария инициализации?
источник
pidof
не возвращается10001
, потому что программыsh
нет?Я думаю, что вы не должны полагаться
pidof
, это может привести к сбою вашей программы. Простой пример сsupervisord
программой:Вы можете видеть, что
supervisord
фактически вызывается интерпретатором Python, вызываетpidof
сбой:источник
killproc
. Почему вы не используете это, в то время как вы использовалиdaemon
вstart
функции?killproc
для уничтожения самого процесса.parent process
, егоchild process
воля тоже умерла.Команда
pidof
игнорирует сценарии, если вы не включите эту-x
опцию. Кроме того, наиболее безопасно включить полный путь в команду pidof, как в:это минимизирует шансы на совпадение с каким-либо другим процессом.
источник