我试图围绕Linux Screen实用程序创建一个PHP包装器类。 我需要能够按名称启动屏幕会话并返回创建的屏幕的PID。
我不能假设会话名称是唯一的,因此它无法解析session -ls
输出以找到PID。
基于互联网上的示例和建议,我尝试了使用PHP exec()函数的以下方法:
screen -D -m -S 'screen_name' 2>&1 &
-D
参数告诉屏幕不分叉进程,因此它具有与后台进程相同的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
,但据我所知,它应该只是为了屏幕命令,而不是&
运算符。
ALMOST SOLUTION:
screen -D -m -S 'screen_name' 1> /dev/null 2> /dev/null & echo $!
我意识到来自&
后台运算符的终端中显示的文本实际上并非来自命令stdout或stderr。它是显示它的shell。所以我在echo $!
运算符之后添加&
,它将打印上一个命令创建的进程的PID。
这适用于终端,它打印正确的PID。但是当它在PHP中执行时,实际的屏幕PID值比echo
返回的值多4。
就像在&
运算符之前执行echo一样。有没有办法让它等待?
SOLUTION:
我在sudo中包装命令,后台操作符正在使用sudo命令而不是screen命令。确保你逃避命令参数! :)
答案 0 :(得分:0)
ALMOST SOLUTION:
screen -D -m -S 'screen_name' 1> /dev/null 2> /dev/null & echo $!
我意识到来自&
后台运算符的终端中显示的文本实际上并非来自命令stdout或stderr。它是显示它的shell。所以我在echo $!
运算符之后添加&
,它将打印上一个命令创建的进程的PID。
这适用于终端,它打印正确的PID。但是当它在PHP中执行时,实际的屏幕PID值比echo
返回的值多4。
就像在&
运算符之前执行echo一样。有没有办法让它等待?
<强> SOLUTION:强>
我在sudo中包装命令,后台操作符正在使用sudo命令而不是screen命令。确保你逃避命令参数! :)
- 布拉德利奥德尔