我需要创建一个每天执行的脚本(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
导致您收到错误消息的情况下存在多个语法错误。
- 在这种
if
情况下,您需要一个命令或 bash 内置测试构造,该构造0
在成功时返回 (=true),在失败时返回非零 (=false)。您选择执行算术比较,因此需要将其放置在适当的测试构造中:if (( variable1 > variable2 )); then .... ; fi
- 您使用处理 的内容
uptime
,其中包含浮点数。然而,Bash 无法执行浮点运算,因此此类表达式将无法按预期工作。 - 由于您没有将条件放入测试构造中,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