我正试图围绕Linux屏幕实用程序创建一个PHP包装类。
我需要能够按名称启动一个屏幕会话,并获取创建的屏幕的PID。
我不能假设会话名称是唯一的,因此它无法解析session -ls
输出以找到PID。
基于internet上的示例和建议,我使用PHP的exec()函数尝试了以下方法:
screen -D -m -S 'screen_name' 2>&1 &
-D
参数告诉screen不要分叉进程,因此它与后台进程具有相同的PID。因此,我可以从
&
后台shell操作符的输出解析PID,其格式如下:[<number>] <pid>
这个命令可以在Linux shell中运行(立即终止),但是当我从PHP运行它时,它会冻结,浏览器永远不会加载页面。
我试过用PHP的exec()和shell_exec()执行它,结果是一样的。
我还尝试了许多不同的组合与命令的最后一部分,如所描述的HERE。
编辑:
如果使用此命令:
screen -D -m -S 'screen_name' 1> /dev/null 2> /dev/null & 2>&1
然后PHP
exec()
工作。它启动屏幕会话,但是我没有从&
后台操作符获得任何输出。我假设这是因为我将stdout
和stderr
重定向到/dev/null
,但据我所知,它应该只针对screen命令,而不是&
操作符。几乎解决方案:
screen -D -m -S 'screen_name' 1> /dev/null 2> /dev/null & echo $!
我意识到终端中显示的来自
&
后台操作符的文本实际上并不是来自stdout或stderr命令。是显示它的外壳。所以我在echo $!
操作符后面添加了&
,它将打印由最后一个命令创建的进程的PID。这在终端工作,它打印正确的PID。但当它在PHP中执行时,实际的屏幕PID值比
echo
返回的值多4。就像回声是在
&
运算符之前执行的。有什么办法让它等着吗?解决方案:
我正在用sudo包装命令,后台操作员正在对sudo命令而不是screen命令执行操作。一定要避开命令参数!:)
最佳答案
几乎解决方案:
screen -D -m -S 'screen_name' 1> /dev/null 2> /dev/null & echo $!
我意识到终端中显示的来自
&
后台操作符的文本实际上并不是来自stdout或stderr命令。是显示它的外壳。所以我在echo $!
操作符后面添加了&
,它将打印由最后一个命令创建的进程的PID。这在终端工作,它打印正确的PID。但当它在PHP中执行时,实际的屏幕PID值比
echo
返回的值多4。就像回声是在
&
运算符之前执行的。有什么办法让它等着吗?解决方案:
我正在用sudo包装命令,后台操作员正在对sudo命令而不是screen命令执行操作。一定要避开命令参数!:)
–布拉德利·奥德尔
关于php - 创建Linux Screen session 并获取其PID,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38405110/