我正在编写一个程序,它会在某个时候调用shell脚本。我需要这个shell脚本(bash,或者如果需要,PHP 4+可以工作)由程序调用,并返回一个退出状态,我可以在达到1分钟之前中继,系统重新启动。
以下是我的意思,我能说的最好:
除了退出状态之外,我可以让一切工作 - 无论我尝试什么,程序永远不会退出循环等待退出状态,所以它永远不会返回任何东西,但重启仍然会发生。这个程序运行其他返回退出状态的脚本,所以我也需要这个以保持功能和所有...
感谢任何帮助!
编辑 - 调用重启脚本的程序是一个循环运行的PHP脚本。当某些事件发生时,程序会运行某些脚本并回显退出状态。所有这些都可以工作但是 - 它永远不会返回退出状态。
使用system($ cmd)调用脚本,其中$ cmd为'./scriptname.sh'
答案 0 :(得分:0)
假设您正在使用proc_open打开进程,那么调用proc_get_status应该返回一个包含退出代码的数组。
答案 1 :(得分:0)
您可以创建一个背景关闭过程的bash脚本:
#!/bin/bash
shutdown -r 1 &
exit 0
这会将控制权返回给父shell,后者接收“0”作为退出代码。
答案 2 :(得分:0)
不幸的是,您不能依赖PHP的 system()和 exec()函数来检索正确的返回值,但是在 BASH 中很好的解决方法,可以真正有效地解析退出代码:
function runthis($command) {
$output = array();
$retcode = -1;
$command .= " &2>1; echo $?";
exec($command, $output, $retcode);
$retcode = intval(array_pop($output));
return $retcode;
}
if (runthis("shutdown -r 1") !== 0) echo "Command failed!\n";
让我分解一下代码在做什么:
$command .= " &2>1; echo $?";
- 展开命令,以便将stderr传递给stdout,然后运行echo $?
echo $?
- 这个特殊的bash参数扩展为最后执行的命令的退出代码。exec($command, $output, $retcode);
- 执行命令。 ($ retcode只是一个占位符,因为返回的数据不值得信任。我们稍后会覆盖它。)命令的输出将作为数组写在$ output中。每个元素都代表一行。$retcode = intval(array_pop($output));
- 将最后一行解析为整数。 (因为最后一个命令是echo $?
,它将始终是实际的exitcode。这就是你所需要的!虽然它是一个非常粗糙的代码,并且如果使用不正确就容易出错,它非常适合执行更简单的任务,它总能为您提供正确的退出代码。
对于更专业(和程序化)的方法,您必须深入了解PHP的 pnctl , posix ,流功能,还有 Linux管道处理。