如何编写'shutdown -r 1'脚本并返回退出状态?

时间:2011-10-25 03:13:45

标签: php bash shell exit

我正在编写一个程序,它会在某个时候调用shell脚本。我需要这个shell脚本(bash,或者如果需要,PHP 4+可以工作)由程序调用,并返回一个退出状态,我可以在达到1分钟之前中继,系统重新启动。

以下是我的意思,我能说的最好:

  • 程序调用'reboot'脚本
  • 重新启动脚本运行'shutdown -r 1',然后退出状态为0
  • 程序echo退出退出状态
  • 服务器重新启动

除了退出状态之外,我可以让一切工作 - 无论我尝试什么,程序永远不会退出循环等待退出状态,所以它永远不会返回任何东西,但重启仍然会发生。这个程序运行其他返回退出状态的脚本,所以我也需要这个以保持功能和所有...

感谢任何帮助!

编辑 - 调用重启脚本的程序是一个循环运行的PHP脚本。当某些事件发生时,程序会运行某些脚本并回显退出状态。所有这些都可以工作但是 - 它永远不会返回退出状态。

使用system($ cmd)调用脚本,其中$ cmd为'./scriptname.sh'

3 个答案:

答案 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管道处理。