【问题标题】:Use PHP to start/restart process使用 PHP 启动/重启进程
【发布时间】:2024-04-17 20:30:02
【问题描述】:

我创建了一个 php 脚本,它允许我单击一个按钮来重新启动一个 PHP 脚本。但是,我不确定最好的方法。这是它的快照:http://i51.tinypic.com/2niz32o.png

我目前有这个:

if(isset($_POST['login_restart']))
{
    $command = exec("/usr/bin/php /var/www/html/login_server.php >/dev/null &");
    $pid = exec("nohup $command > /dev/null 2>&1 & echo $!");
    $info = "Login server started...PID: $pid";
}

但是,这似乎不起作用。我需要它,所以当按下“重新启动”按钮时,它会启动登录服务器并保持运行。我一直在 SSH 中使用 screen 功能,但是,我不想一直登录到 SSH 来重新启动登录服务器。我想以某种方式使用进程 ID,这样我就可以检查脚本是否正在运行,如果没有,它将允许我单击“重新启动”按钮。

谢谢。

【问题讨论】:

    标签: php shell process ssh


    【解决方案1】:

    您是否有特殊原因要手动而不是自动执行此操作?不是应该一直重启服务器吗?

    我的建议是自动执行此操作,方法是使用 cron 定期检查脚本的状态,或者使用 bash 无限循环脚本不朽。

    为了方便起见,首先创建一个启动器脚本来调用您的 PHP,并将其命名为 run_login_server.sh(不要忘记 chmod +x 以便它可以执行):

    #!/bin/bash
    /usr/bin/php /var/www/html_login_server.php > /dev/null
    

    然后创建login_server_daemon.sh 以无限循环运行您的脚本(同样,chmod +x 使其可执行):

    #!/bin/bash
    while :
    do
      ./run_login_server.sh # or any command line to be executed forever
    done
    

    注意我没有在上面的bash 脚本中后台处理php 进程。它可以工作,因为 bash 循环每次都会调用 php,并且只有在 php 死亡后循环才会再次迭代。只需执行login_server_daemon.sh 即可启动循环(通过初始化服务或在您现在使用的分离屏幕会话中)。

    如果您的 PHP 脚本挂起,或者您因为更新了代码而想要重新加载它们,您可以简单地终止循环进程 –run_login_server.sh,然后 bash 循环将重新生成它。 p>

    就像killall run_login_server.sh 一样简单,你可以通过php 的exec 来完成。 请注意,您需要注意谁执行了什么的用户权限:如果您以 your_username 执行 login_server_daemon.sh 但 php 以 php_username 运行,则 php 将无权 killall 您的进程。

    最后,如果您无法在 cronscript 方法之间进行选择,请考虑以下因素:

    脚本应该永远存在,并且只有在以下情况下才会死掉你的小 bash 脚本停止是你最不担心的。脚本的一个好处是,在 php(或您想在无限循环中调用的任何内容)死后立即重新启动。

    cron 有一个问题,如果您真的关心立即恢复,它只能在最频繁的设置下每分钟检查一次。它还有一个额外的烦恼,如果你决定停止脚本,你还必须将它从你的 crontab 中删除,否则它就会恢复生机。

    【讨论】:

    • 原因是脚本有时会挂起和冻结,​​我每天都会对脚本进行大量更改(添加游戏项目等)。我只是发现在需要时单击按钮重新启动该过程更容易。
    • 知道了。在这种情况下,请考虑组合方法:运行不朽 bash 脚本以在服务器死亡时重新启动服务器,并创建一个脚本以在您想要更新或它们挂起时杀死它们。
    • 关于这个的事情是我需要给其他几个人访问权限(不给他们 SSH 访问权限),所以我更喜欢一个表单,这样他们就可以简单地点击“重启”按钮,然后重新启动脚本。
    • 编辑了我的答案,以明确如何通过 PHP 的 exec 杀死循环脚本保持活动状态的操作来随意重新启动。我把你的 php 命令变成了一个 bash 脚本,给它一个独特的名字,很容易被killall
    • 好的,我试过你说的,使用exec:exec("killall /var/www/html/run_login_server.sh");,但是脚本仍然没有启动...