/bin/bash 复制代码

/bin/bash 复制代码

我正在尝试设置一个脚本,当没有 cron 作业运行时,该脚本会关闭虚拟机。还会有另一个脚本在下一个计划的 cron 作业前一小时启动虚拟机。为此,到目前为止,我发现最好的方法是使用pstree并查看该进程是否产生了任何进程,而无需干预 cron 作业本身。还有其他方法可以解决这个问题吗?此外,使用来确定 cron 是否产生了进程cron有什么缺陷吗?pstree

答案1

每个过程都有一个父进程ID,因此您可以查找由 cron 生成的那些。如果您知道进程 IDCRON(在 Debianoids 中它位于/run/crond.pid),你可以使用以下命令查找 的CRON子项:

ps --ppid $(</run/crond.pid)

或者使用返回代码ps关闭系统:

PIDFILE=/run/crond.pid
if ! [ -f $PIDFILE ] || ! ps --ppid $(<$PIDFILE) >/dev/null; then
    /sbin/shutdown
fi

答案2

此外,使用pstree来确定 cron 是否产生了一个进程是否存在缺陷。

是的,这是有缺陷的,它不可靠。特别是如果 cron 被停止或重新启动,正在运行的作业将变得孤立,但仍会运行(取决于哪个 cron 实现)。就其本身而言,cron 本质上是“发射后不管”的。

更好的办法是让作业本身跟踪状态。每个作业都可以带走一群羊或做其他事情,但为每个作业编写代码很烦人。

相反,考虑使用像 systemd 这样的作业系统。systemd 服务会跟踪运行状态,并且可以与其他单元(包括系统关闭)绑定。实际上,还可以添加计时器,这样您就可以替换 cron。

答案3

打开 Linux PC 的可靠性可能不如关闭它。

“BIOS 唤醒”- BIOS 有一个易于使用的唤醒调度程序,可根据需要启用和设置。
“Wakeonlan”- 这涉及从第二台计算机向要打开的设备发送信号。“RTC”- 检查您的内核是否支持 RTC,如果支持,请执行以下脚本。

/bin/bash 复制代码

sh -c "echo 0 > /sys/class/rtc/rtc0/wakealarm" # 如果已经存在唤醒闹钟则为零
sh -c "echo date '+%s' -d '+ 60 minutes'> /sys/class/rtc/rtc0/wakealarm" # 设置闹钟在 60 分钟后唤醒机器
shutdown -h now #关闭机器

相关内容