创建Linux Screen会话并获取其PID

时间:2016-07-15 21:14:01

标签: php linux pid gnu-screen

我试图围绕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()有效。它会启动屏幕会话,但之后我无法从&后台操作员那里获得任何输出。我假设它是因为我将stdoutstderr重定向到/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命令。确保你逃避命令参数! :)

1 个答案:

答案 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命令。确保你逃避命令参数! :)

- 布拉德利奥德尔