BASH:如何退出脚本,触发直到重新生成脚本

时间:2015-04-18 14:54:06

标签: linux bash shell kill

我在命令行,我想手动触发,直到。因此,在生成过程中,直到观察它为止。

这是我的剧本

#!/bin/bash

echo '**************************************'
echo '*          Run IRC Bot               *'
echo '**************************************'
echo '';
if [ -z "$1" ] 
    then
        echo 'Example usage: ' $0 'intelbot'
fi

until `php $1.php`; 
    do 
        echo "IRC bot '$1' crashed with the code $?.  Respawning.." >&2; 
        sleep 5 
done;

我应该用什么杀戮选项来说,直到,嘿我希望这个过程被杀死,我希望你让它再次运作!

1 个答案:

答案 0 :(得分:1)

首先 - 根本不要这样做;使用适当的流程监督系统为您自动重启程序,而不是shell脚本。您的操作系统将附带一个,不管是SysV init的/etc/inittab(是的,如果给出适当的标志,它们将在退出后重新启动程序),或更现代的新贵(Ubuntu附带),systemd(与当前的Fedora和Arch Linux一起发布,runit,daemontools,supervisord,launchd(随MacOS X一起提供)等。


第二:反引号实际上使你的代码以不可预测的方式运行;扩展报告缺乏报价也是如此。

`php $1.php`

...执行以下操作:

  • $1的值替换为字符串;让我们说它是my * code.php
  • 字符串 - 拆分该值;在这种情况下,它会将其更改为三个单独的参数:my*code.php
  • 全球 - 扩大这些论点;在这种情况下,*将替换为当前目录中每个文件的单独参数
  • 运行生成的程序
  • 读取程序写入stdout的输出,并将该输出作为单独的命令运行
  • 返回该单独命令的退出状态。

相反:

until php "$1.php"; do 
    echo "IRC bot '$1' crashed with the code $?.  Respawning.." >&2; 
    sleep 5 
done;

现在,PHP收到SIGTERM时返回的退出状态可以由PHP的信号处理程序控制 - 除非你告诉我们你的PHP代码是如何编写的,只有代码无法处理(例如SIGKILL)将以完全一致的方式运行,而因为无法处理它们,如果您的程序需要进行任何类型的安全关闭或清理,它们就会很危险。

如果您希望PHP代码安装信号处理程序,那么您可以在发出信号时控制其退出状态,请参阅http://php.net/manual/en/function.pcntl-signal.php

相关问题