【问题标题】:BASH: How to exit from a script, trigging until to respawn the scriptBASH:如何退出脚本,触发直到重新生成脚本
【发布时间】:2015-04-18 14:54:05
【问题描述】:

我在命令行,我想手动触发直到。从而使生成的进程在直到正在观察它时终止。

这是我的脚本

#!/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;

我应该使用什么终止选项,直到,嘿,我希望这个进程被终止,我希望你让它再次工作!

【问题讨论】:

  • 我们不会为每种语言的每个有效结构添加标签。
  • 我明白了,它对帖子有效,对stackoverflow.com/questions/696839/…有效
  • 顺便说一句,反引号是错误的。使用until php "$1.php",没有反引号。
  • 抱歉,我的帖子已被标记,但我使用了有效的 bash 语法,目的是为了在 stackoverflow.com/questions/696839/… 中使用我被推荐的目的
  • Re: 你的链接,顺便说一句——lhunath 是我非常尊敬的人。值得注意的是,流程监督系统大多按照他们帖子描述的方式工作,通过启动和等待孩子。 (例外情况是 systemd 等系统,它可以在该模式下运行,但也支持以下分叉和其他机制。

标签: linux bash shell kill


【解决方案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
  • 全局扩展这些参数;在这种情况下,* 将替换为当前目录中每个文件的单独参数
  • 运行生成的程序
  • 读取程序写入标准输出的输出,并将该输出作为单独的命令运行
  • 返回该单独命令的退出状态。

改为:

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

【讨论】:

  • 感谢您花时间回复。由于您的回答如此完整,我将向您提供有关我的环境的更多信息,以便您提供更具体的建议。我已经遇到了您已经提到的所有内容,并决定使用这种方法。所以我很想听听你要说什么。我运行 CentOS 6,请告诉我您需要的任何其他信息。
  • 是的,我愿意。当然是 EPEL。
  • 主管包在 EPEL 中可用。见supervisord.org/running.html#adding-a-program
  • 是的,但我的问题仍然存在,如何“重生”一个进程?
  • supervisord 会自动执行此操作。你告诉它运行的任何东西,它都会在启动时启动并在死亡时重新启动(除非另有配置)。阅读您已链接到的精美手册。
猜你喜欢
  • 1970-01-01
  • 2023-01-28
  • 1970-01-01
  • 2010-11-25
  • 2016-07-27
  • 1970-01-01
  • 1970-01-01
  • 2017-12-03
  • 1970-01-01
相关资源
最近更新 更多