You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过网页控制Forever脚本问题:shell_exec返回无进程但PuTTY执行正常

解决网页执行forever list无进程显示的问题

这种情况我之前碰到过好几次,大概率是网页服务器的运行用户和你手动执行forever的用户不一致,或者环境变量配置不匹配导致的。给你几个排查和解决的思路:

  • 先确认网页的运行用户
    在PHP代码里加一行echo shell_exec('whoami');,看看网页当前用的是哪个用户(比如Apache默认是www-data,Nginx通常也是这个用户)。你手动在PuTTY里用的用户(比如root或你的个人用户)和这个用户不是同一个,自然看不到对方启动的forever进程。

  • 指定forever的完整路径
    网页用户的环境变量PATH可能没包含forever的安装目录。先在PuTTY里执行which forever,得到完整路径(比如/usr/local/bin/forever),然后把你的代码改成:

    if ($_GET['list']) { 
        $list = shell_exec("/usr/local/bin/forever list"); 
        echo ($list); 
    }
    

    这样就能确保网页用户找到forever命令了。

  • 让进程归属网页用户
    如果允许的话,直接用网页服务器的用户启动forever进程。比如在PuTTY里执行:

    sudo -u www-data /usr/local/bin/forever start your_script.js
    

    这样进程属于www-data,网页执行forever list(记得加完整路径)就能正常看到。

  • 用sudo切换用户执行(谨慎使用)
    如果必须用原来的用户运行forever,可以给网页用户配置sudo免密权限。编辑/etc/sudoers文件(建议用visudo编辑避免语法错误),添加一行:

    www-data ALL=(root) NOPASSWD: /usr/local/bin/forever
    

    然后代码改成:

    if ($_GET['list']) { 
        $list = shell_exec("sudo /usr/local/bin/forever list"); 
        echo ($list); 
    }
    

    注意:这种方式有安全风险,一定要限制sudo只能执行forever命令,不要给全权限。

  • 额外提醒:注意代码安全
    你现在直接通过$_GET['list']触发命令执行,非常容易被命令注入攻击。建议:

    • 严格验证参数值,比如只允许list这个特定值才执行
    • 改用POST请求传递参数
    • 加上身份验证(比如密码验证),避免任意人访问这个接口

内容的提问来源于stack exchange,提问作者Damian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:59:58