gpt4 book ai didi

php - 创建 Linux Screen session 并获取其 PID

转载 作者:太空宇宙 更新时间:2023-11-04 12:47:09 25 4
gpt4 key购买 nike

我正在尝试围绕 Linux Screen 实用程序创建一个 PHP 包装器类。我需要能够按名称启动 screen session 并取回所创建 screen 的 PID。

我不能假定 session 名称是唯一的,因此它无法解析 session -ls 输出以找到 PID。

根据 Internet 上的示例和建议,我使用 PHP 的 exec() 尝试了以下方法功能:

screen -D -m -S 'screen_name' 2>&1 &

-D参数告诉screen不要fork进程,所以它和后台进程有相同的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() 工作。它启动了 screen session ,但随后我没有从 & 后台运算符(operator)那里得到任何输出。我假设这是因为我将 stdoutstderr 重定向到 /dev/null 但据我所知它应该只是为 screen 命令执行此操作,而不是 & 运算符。

几乎解决方案:

screen -D -m -S 'screen_name' 1> /dev/null 2> /dev/null & echo $!

我意识到 & 后台操作符在终端中显示的文本实际上并不是来自命令 stdout 或 stderr。这是显示它的外壳。所以我在 & 运算符之后添加了 echo $! ,它将打印上一个命令创建的进程的 PID。

这在终端中有效,它打印出正确的 PID。但是当它在PHP中执行时,实际的 screen PID值比echo返回的值多了4。这就像在 & 运算符之前执行 echo 一样。有什么办法让它等待吗?

解决方案:

我将命令包装在 sudo 中,后台运算符(operator)正在执行 sudo 命令而不是 screen 命令。确保转义命令参数! :)

最佳答案

几乎解决方案:

screen -D -m -S 'screen_name' 1> /dev/null 2> /dev/null & echo $!

我意识到 & 后台操作符在终端中显示的文本实际上并不是来自命令 stdout 或 stderr。这是显示它的外壳。所以我在 & 运算符之后添加了 echo $! ,它将打印上一个命令创建的进程的 PID。

这在终端中有效,它打印出正确的 PID。但是当它在PHP中执行时,实际的 screen PID值比echo返回的值多了4。这就像在 & 运算符之前执行 echo 一样。有什么办法让它等待吗?

解决方案:

我将命令包装在 sudo 中,后台运算符(operator)正在执行 sudo 命令而不是 screen 命令。确保转义命令参数! :)

——布拉德利·奥德尔

关于php - 创建 Linux Screen session 并获取其 PID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38405110/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com