Ubuntu中PHP执行Shell命令提示命令未找到的问题求助
问题分析与解决
1. 解决 source: not found 错误
shell_exec() 默认调用系统的sh shell,而source是bash专属的内置命令(sh如dash没有这个命令)。可以通过两种方式解决:
- 强制用bash执行命令:
shell_exec("/bin/bash -c 'source ~/.bashrc && 你的后续命令'"); - 改用sh兼容的语法(注意:如果
.bashrc里有bash专属语法,可能无法正常解析):shell_exec(". ~/.bashrc");
2. 解决 pm2: not found 错误
PHP执行shell命令时的环境变量PATH和你登录服务器时的PATH不一致,导致系统找不到pm2的可执行文件。解决思路有三种:
- 使用绝对路径执行:先登录服务器执行
which pm2,得到pm2的绝对路径(比如/usr/local/bin/pm2),然后修改脚本:
(注意:你原命令里的shell_exec("/usr/local/bin/pm2 restart 3");restrat是拼写错误,正确是restart) - 手动指定PATH:把pm2所在的目录加到命令的PATH中:
(替换shell_exec("PATH=/usr/local/bin:$PATH pm2 restart 3");/usr/local/bin为实际的pm2所在目录) - 用登录shell加载完整环境:让bash以登录shell模式启动,自动加载
.bashrc/.profile等配置,获取完整的PATH:shell_exec("/bin/bash -l -c 'pm2 restart 3'");
核心原因总结
PHP通过shell_exec()执行命令时,会使用非交互式的sh环境,和你手动登录服务器时的bash登录shell相比:
- 默认使用的shell类型不同
- 环境变量(尤其是PATH)不包含用户自定义的路径配置
通过调整命令的执行方式,让它使用bash或加载完整环境变量,就能解决这类"命令找不到"的问题。
内容的提问来源于stack exchange,提问作者Toma Tomov
相关产品推荐
相关产品推荐

