На Ubuntu я скопировал /etc/init.d/
скелет как новый файл и сделал его исполняемым "все" (как и другие в этом каталоге). В нем я сделал "foo", который был просто еще одним сценарием Bash в /usr/sbin
, но он был особенным в том, что он сидит в цикле, ожидая соединения именованного канала с веб-страницы PHP. (Подробнее об этом Вот, хотя это побочная тема.)
Поскольку он должен ждать в цикле на соединении именованного канала, это, очевидно, повесило команду в командной строке. Ничего страшного, потому что я действительно хочу, чтобы он завис и ждал нового соединения. Но я не хочу, чтобы это происходило на переднем плане. Итак, я заставил start-stop-daemon использовать параметр --background.
Хорошо, он отлично работает для запуска и состояния, но остановка не работает - команда оставляет команду в памяти, а также cat /tmp/pipe
команда у меня в моем /usr/sbin/foo
Скрипт на Bash. Они предупреждают, что это может произойти при использовании параметра --background в команде start-stop-daemon.
ВОПРОС
Итак, как правильно остановить / usr / sbin / foo, когда он запускается с start-stop-daemon --background
вместе с остановкой любых дочерних процессов (например, команды cat / tmp / pipe), которые могут быть вызваны / usr / sbin / foo? Я имею в виду, что я мог бы использовать killall, но это смертельно опасно. Возможно, вы знаете более эффективный способ?
Я бы рекомендовал проконсультироваться с LSB:
http://refspecs.freestandards.org/LSB_3.1.0/LSB-Core-generic/LSB-Core-generic/tocsysinit.html
Вот ориентированная на Debian вики по тому же вопросу, которая также может быть полезна:
http://wiki.debian.org/LSBInitScripts
Обычно вы храните файл pid где-то в / var / run, а затем явно убиваете эту команду при остановке.
Думаю, в этой ситуации снаряд будет лидером группа процессов содержащий различные команды, выполняемые сценарием. Вы можете убить группу процессов, отправив сигнал противоположному PID группы процессов:
kill -TERM -$(cat /var/run/my_shell_daemon.pid)