我有一个 bash 脚本,用户可以使用while do
它来sleep
不断监视连接状态并在出现问题时采取措施。唯一不受保护的是检查脚本本身的执行。
我希望myscript.sh
通过 init.d 条目在启动时执行,然后每分钟执行一次 CRON 任务,以查看我在启动时自动运行的脚本是否仍在执行。我怎样才能实现这个目标?
答案1
使用现代 init 系统(如 systemd 或 upstart),您可以让 init 系统在脚本失败时负责重新启动脚本。
如果由于某种原因您无法使用旧系统,您可以让脚本定期更新标志文件 ( touch /var/lib/myapp/flagfile
),然后通过 cron 检查标志文件是否早于一定秒数,并在必要时重新启动脚本。就像是:
# get current time (in seconds since the epoch)
now=$(date +%s)
# get flag file mtime (in seconds since the epoch)
last_update=$(stat --printf '%Y' /var/lib/myapp/flagfile)
if [ $(( now - last_update )) -gt $interval ]; then
restart_script_here
fi
使用系统
如果你有 systemd 可用,你只需创建一个.service. unit with the
Restart=always key, which instructs systemd to restart the script whenever it fails. E.g., put something like this in
/etc/systemd/system/myscript.service`:
[Unit]
Description=This is my nifty service.
# Put any dependencies here
[Service]
Type=simple
ExecStart=/path/to/myscript
Restart=always
[Install]
WantedBy=multi-user.target
然后使用以下命令激活它:
# systemctl enable myscript
# systemctl start myscript
使用计划任务
您可以不运行持久脚本,而只需运行常规 cron 作业来执行任何必要的检查和补救。您将被限制为每分钟检查一次,但如果该频率可以接受,这可能是一个更简单的解决方案。