Я пишу сценарий инициализации lsb (по общему признанию, то, что я никогда не делал с нуля), который запускает сценарий php, который демонизирует себя. Скрипт php начинается так:
#!/usr/bin/env php
<?php
/* do some stuff */
Затем он запускается так, как в сценарии инициализации:
# first line is args to start-stop-daemon, second line is args to php-script
start-stop-daemon --start --exec /path/to/executable/php-script.php \
-- --daemon --pid-file=$PIDFILE --other-php-script-args
В --daemon
флаг заставляет скрипт php отключаться и запускаться как сам демон, а не полагаться на start-stop-daemon
отсоединить его.
Вот как он (пытается) остановить его в сценарии инициализации:
start-stop-daemon --stop --oknodo --exec /path/to/executable/php-script.php \
--pidfile $PIDFILE
Проблема в том, что когда я пытаюсь остановиться с помощью сценария инициализации, он дает мне следующее:
$ sudo /etc/init.d/my-lsb-init-script stop
* Stopping My Project
No /path/to/executable/php-script.php found running; none killed.
...done.
Быстрый взгляд на ps
сообщает мне, что, хотя сам скрипт php является исполняемым, он работает как php <script>
а не само имя сценария, которое не позволяет демону start-stop-daemon его увидеть. Файл PID даже создается, но, похоже, игнорирует его и вместо этого пытается найти + kill по имени процесса.
$ ps ax | grep '/path/to/executable/php-script.php'
2505 pts/1 S 0:01 php /path/to/executable/php-script.php --daemon --pid-file /var/run/blah/blah.pid --other-php-script-args
2507 pts/1 S 0:00 php /path/to/executable/php-script.php --daemon --pid-file /var/run/blah/blah.pid --other-php-script-args
2508 pts/1 S 0:00 php /path/to/executable/php-script.php --daemon --pid-file /var/run/blah/blah.pid --other-php-script-args
2509 pts/1 S 0:00 php /path/to/executable/php-script.php --daemon --pid-file /var/run/blah/blah.pid --other-php-script-args
2518 pts/1 S 0:01 php /path/to/executable/php-script.php --daemon --pid-file /var/run/blah/blah.pid --other-php-script-args
$ cat /var/run/blah/blah.pid
2518
Я что-то совершенно не понимаю? Или есть простой способ обойти это?
Правильная остановка:
start-stop-daemon --stop --oknodo --pidfile $PIDFILE