【问题标题】:sh/expect/sudo/screen all needed together in one commandsh/expect/sudo/screen 都需要在一个命令中一起使用
【发布时间】:2010-08-28 00:18:33
【问题描述】:

我需要发生的事情:PHP 需要启动一个在后台运行的具有 root 权限的服务器应用程序。这一切都应该保持沉默。

-sudo 需要允许 php 执行需要 root 权限的操作。

-需要屏幕才能允许应用在启动该过程的网页范围之外运行。

-需要期望,以便屏幕有一个可以运行的点

-Sh 是必需的,因为任何开始运行的东西都需要在后台运行,大概是使用 & 运算符。它还需要将任何输出通过管道传输到 /dev/null/,因为我不希望我的 PHP 页面返回任何内容。如果有人能想出一种更好的方法来用 PHP(fork...?)进行调用,这可能是可以协商的。

例如,我尝试使用的脚本是:

#!/usr/bin/expect -f
spawn sh ( screen -t srcds /usr/local/srcds_l/startserv )& > /dev/null
exit 0

作为参考,我正在尝试启动 Counter-Strike Source 服务器,而 startserv 是处理启动服务器并收集其输出的 C 代码的名称。谁能纠正我的 sn-p 语法,或者告诉我为什么这样做是错误的?

【问题讨论】:

  • 你可能会在这里得到一些回应,但 serverfault.com 可能会让人们对这类事情更有经验。

标签: bash shell expect sudo gnu-screen


【解决方案1】:

最终解决了这种情况,方法是使用 fork 和进程组控件使进程自行守护进程,然后让 PHP 执行带有 sudo 的系统调用。

我最终发现了另一个类似的情况

unbuffer -p

它在内部使用 screen,并且完成了我最初考虑让 screen expect 和 sh 做的那种工作。

【讨论】:

    【解决方案2】:

    我没有为您提供完整的解决方案,但您可能希望查看 nohup 而不是 screen。这也消除了 Expect 需求。

    【讨论】:

      【解决方案3】:

      传达 1 位信息(“现在开始自己”)的开销很大。如果您忘记了 PHP,那么所有其他从属需求都将消失。

      如果我尝试这样做,我可能会编写一个 perl 脚本来侦听 TCP 端口上的“启动”命令,然后将进程本身分叉。这消除了对 sh、expect、screen 和 sudo 的需求。

      【讨论】:

      • PHP 有点必须在那里,因为整个事情需要通过提交 AJAX 请求的网页中的按钮来调用。我有点怀疑拥有一个完整的额外监听守护程序是否更有效听到来自 PHP 的非常偶然的 TCP 请求。当然你是对的,那里可能有很多不必要的开销。我想叉子会消除对屏幕的需求,不是吗。
      猜你喜欢
      • 1970-01-01
      • 2023-04-04
      • 2016-04-24
      • 1970-01-01
      • 2017-07-03
      • 1970-01-01
      • 2012-12-01
      • 2015-02-15
      • 1970-01-01
      相关资源
      最近更新 更多