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

Правильное создание скрипта Bash Daemon

На 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)