我正试图围绕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

然后PHPexec()工作。它启动屏幕会话,但是我没有从&后台操作符获得任何输出。我假设这是因为我将stdoutstderr重定向到/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/

10-16 20:36