如何检查正常运行时间是否大于72小时?

如何检查正常运行时间是否大于72小时?

我需要创建一个每天执行的脚本(cron 作业),计算系统的正常运行时间,如果该数字大于 72 小时,则重新启动系统。

我在将小时值转换为可以与 72 进行比较的过程中迷失了方向。它让我回归6499.04: command not found

#!/bin/bash
if $(awk '{print $1}' /proc/uptime) / 3600 > 72 ; then
    echo "yes"                                                                                                                                                                        
fi

预先感谢您的任何帮助!

答案1

我会在 AWK 中完成整个测试:

awk '$1 > (72 * 3600) { print "yes" }' /proc/uptime

如果您想将其用作测试,请使用退出代码:

if awk '{ exit ($1 < (72 * 3600)) }' /proc/uptime; then
    echo Need to reboot
fi

($1 < (72 * 3600))如果比较失败,AWK 计算结果为 0,否则计算结果为 1; 0 表示成功作为退出代码,因此我们反转条件。

如果您使用 systemd,另一种方法是使用 systemd 计时器,其中OnBootSec=72h(看FelixJN 的回答了解详情)。

答案2

systemd 计时器也可以工作:

[Unit]
Description=reboot after 72h
 
[Timer]
Unit=systemd-reboot.service
OnBootSec=72h

[Install]
WantedBy=multi-user.target

请注意,这不是一个服务,而是一个计时器,即文件名必须以.timer.将其放入 eg 中/etc/systemd/system/reboot27h.timer,然后像往常一样在当前会话中启用并启动它:

systemctl enable reboot72h.timer
systemctl start reboot72h.timer

要检查计时器是否正常工作以及距离下一次运行还剩多少时间,请使用

systemctl list-timers

答案3

您的脚本在if导致您收到错误消息的情况下存在多个语法错误。

  1. 在这种if情况下,您需要一个命令或 bash 内置测试构造,该构造0在成功时返回 (=true),在失败时返回非零 (=false)。您选择执行算术比较,因此需要将其放置在适当的测试构造中:
    if (( variable1 > variable2 )); then .... ; fi
    
  2. 您使用处理 的内容uptime,其中包含浮点数。然而,Bash 无法执行浮点运算,因此此类表达式将无法按预期工作。
  3. 由于您没有将条件放入测试构造中,Bash 会将awk文本处理的结果视为要执行的命令,因此它会尝试“执行”当前的正常运行时间(错误消息的原因)。

为了缓解这种情况,您可以使用第一个.作为字段分隔符将秒截断为整数值。所以,你可以尝试

up=$(awk -F. '{print $1}' /proc/uptime)
if (( up > 72*3600 )); then echo "yes"; else echo "no"; fi

请注意

  • 问题已标记,所以我使用了 bash 特定的(( ... ))测试结构。如果您希望脚本可移植,则必须使用 POSIX 兼容的
    if [ $up -gt 259200 ]; then ...; else ...; fi
    
  • 作为一般规则,我建议您通过以下方式运行 shell 脚本shellcheck,也可以在许多 Linux 发行版上作为独立程序使用,以捕获语法错误等。

答案4

#! /bin/bash

if [ $(awk '{print int($1/3600)}' /proc/uptime) -gt 72 ]; then
    echo "yes"
fi

相关内容