我想编写一个永不消亡的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]
.