gpt4 book ai didi

linux - BASH:如何监视脚本执行失败

转载 作者:太空宇宙 更新时间:2023-11-04 05:02:07 25 4
gpt4 key购买 nike

我正在使用 Linux 来监视脚本执行,以便在脚本执行失败时重新生成脚本。给出的是一个简单的 1 行脚本,应该有助于演示问题。

这是我的脚本

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

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

编辑这里的目的是手动检查脚本执行失败,以便重新生成 IRC 机器人。发布的答案非常详细,因此给贡献者+1 - 主管确实是解决这个问题的最佳方法。

最佳答案

首先——根本不要这样做;使用适当的进程监控系统来自动为您重新启动程序,而不是 shell 脚本。您的操作系统将附带一个,可以是 SysV init 的 /etc/inittab (是的,如果给定适当的标志,它将在退出时重新启动列出的程序),或者更现代的 Upstart (随 Ubuntu 附带)、systemd(随当前的 Fedora 和 Arch Linux 附带)、runit、daemontools、supervisord、launchd(随 MacOS X 附带)等。

<小时/>

第二:反引号实际上会让你的代码以不可预测的方式运行;扩展中缺少引号也是如此。

`php $1.php`

...执行以下操作:

  • $1的值替换为字符串;假设它是 my * code.php
  • 字符串分割该值;在本例中,它会将其更改为三个单独的参数:my*code.php
  • Glob 扩展这些参数;在这种情况下,* 将替换为当前目录中每个文件的单独参数
  • 运行生成的程序
  • 读取程序写入标准输出的输出,并将该输出作为单独的命令运行
  • 返回该单独命令的退出状态。
<小时/>

相反:

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

关于linux - BASH:如何监视脚本执行失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29718905/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com