下面的方案就像Debian下我的vagrantbox中的一个魅力,但在FreeBSD下的生产中不能正常工作。
1)我通过控制台执行我的symfony命令:php my:command start
。它从内部运行my:daemon
命令,包含在屏幕中,如下所示:cd ~/path && screen -dmS mydaemon php bin/console my:daemon
,它运行良好。
2)当该命令启动时,它会在screen -dmS myworkerX php bin/console my:worker --id=X
这样的屏幕上执行另外3个命令,这也很有用。
为了您的理解,它在流程树中的外观如何:
- screen -dmS mydaemon php bin/console my:daemon
- php bin/console my:daemon
- screen -dmS myworker1 php bin/console my:worker --id=1
- php bin/console my:worker --id=1
- screen -dmS myworker2 php bin/console my:worker --id=2
- php bin/console my:worker --id=2
- screen -dmS myworker3 php bin/console my:worker --id=3
- php bin/console my:worker --id=3
屏幕命令的结果如下所示:
$ screen -list
There are screens on:
16362.mydaemon (Detached)
16372.myworker1 (Detached)
16378.myworker2 (Detached)
16384.myworker3 (Detached)
此时,所有在freebsd和debian上都可以正常工作。问题出在我的停止脚本中。我运行php bin/console my:daemon stop
,并为所使用的所有屏幕ID调用screen -S screenName -X quit
命令:mydaemon,myworker1,myworker2,myworker3。通常,当包装屏幕进程停止时,它会杀死内部运行的实际进程。在debian下,这是真的。在FreeBSD下它会停止屏幕进程,但是内部的php进程不会受到影响。因此screen -list
命令显示空列表,但ps aux | grep my:worker
表示所有进程都在后台继续工作。
我想问一下,有人可以假设screen
命令在这些操作系统上的行为有何区别?