PHP中通过ssh2_exec执行qsub命令异常问题求助
以下是导致该异常的核心原因及对应解决思路:
IO流未处理导致进程阻塞
ssh2_exec创建的进程会保持标准输入、输出、错误流的句柄,若PHP代码未主动读取或关闭这些流,qsub提交的后台任务可能因等待IO交互而挂起。终端环境中这些流会自动关联终端设备,不会出现阻塞,但PHP的ssh2_exec默认不会处理这些流。
解决:在qsub命令后添加流重定向</dev/null >/dev/null 2>&1,或者用ssh2_fetch_stream读取stdout和stderr并关闭流。环境变量缺失
终端登录时会加载.profile、.bashrc等配置文件,设置集群(如PBS)所需的环境变量(如PATH、PBS_O_WORKDIR),但ssh2_exec执行的是非交互式非登录shell,不会加载这些配置,导致任务因缺少必要环境变量无法执行。
解决:在qsub命令前显式加载配置,比如source ~/.bashrc && qsub list_of_command.sh,或在list_of_command.sh开头设置必要的环境变量。工作目录不匹配
ssh2_exec的默认工作目录可能和终端执行时不同,若list_of_command.sh中使用相对路径引用文件,会导致文件找不到,任务卡住。
解决:在qsub前切换到脚本所在目录,比如cd /path/to/your/script && qsub list_of_command.sh,或在脚本中全部使用绝对路径。缺少TTY终端环境
部分集群的qsub依赖TTY终端环境才能正常提交任务,而ssh2_exec默认不分配TTY。
解决:改用ssh2_shell函数(会分配TTY)模拟终端执行命令,或调用ssh2_tty_allocate为ssh2_exec的会话分配TTY后再执行qsub。
内容的提问来源于stack exchange,提问作者Mohamed Belhocine

