我正在编写一个 lsb init 脚本(诚然,这是我从未从头开始做过的事情),该脚本启动一个可自我守护的 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 文件甚至正在生成,但它似乎忽略了它,而是尝试通过进程名称查找并杀死它。
$ 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
我是不是完全误解了什么?还是有一个简单的方法可以解决这个问题?
答案1
正确停止:
start-stop-daemon --stop --oknodo --pidfile $PIDFILE