永不消亡的 shell 脚本

永不消亡的 shell 脚本

我想编写一个永不消亡的shell脚本,即shell脚本将每五秒重复检查数据库是否处于活动状态。问题是有时 shell 脚本会异常停止/被任何一个脚本杀死。

我想要一个即使停止/杀死也会调用自身的脚本有什么办法可以做到这一点吗???

答案1

使用 crontab 作业来调用您的脚本。

crontab -e

添加以下行

* * * * * /path/to/your/script

这将每分钟执行您的脚本。您可以在此处查看如何自定义其他执行时间。crontab 手册页

抱歉,我错过了每 5 秒运行一次的要求。但就像 Jonnhy 在评论中提到的那样,您可以让 cronjob 验证脚本是否正在运行。

crontab 脚本:

#!/usr/bin/bash
ps -ef|grep -v grep |grep script_name
if [ $? != 0 ]; then
    path/to/script/script_name
fi

在你的脚本中:

#!/usr/bin/bash
while true; do
    #perform the test        
    sleep 5
done

或者,如果您使用的 Linux 仍然基于 init 脚本,您也许可以访问 /etc/inittab

10:35:respawn:/path/ro/your/script

尽管我不太确定将其放在 inittab 中是否是最佳实践。

如果你的系统已经安装了 systemd,还有一种方法可以执行此操作,但我没有经验,无法将其放在这里。

答案2

不要使用带有无限循环的脚本,而是使用执行一次任务但首先休眠 5 秒然后在后台调用自身的脚本:

sleep 5
$0 &
# do whatever

假定该脚本位于 $PATH 中,因为它仅使用名称 ( $0) 进行调用。

如果脚本在“做任何事情”期间死亡/被终止,下一次迭代仍将运行。

答案3

如果您具有 root 权限,则可以将脚本放入 /etc/inittab 或 /etc/init/script.conf 中,具体取决于您的系统使用的系统。使用 /sbin/getty 的条目作为进程在终止时始终重新启动的示例。

答案4

只要进程没有通过 SIGKILL 终止,您就可以使用trap,例如:

#!/bin/bash

trap "" SIGHUP SIGINT SIGTERM

count=0
while ((1)); do
    echo $count
    sleep 2;
    count=$(($count+1));
done    

你不能使用 Ctrl-C (SIGTERM) 来实现这一点。如果你想让它停止,你需要使用kill -9 [pid].

相关内容