我有一个每分钟按计划运行的 bash 脚本。它会检查某个必需的程序是否正在运行,如果没有,则启动它。有时它会在用户实际自动登录之前运行。我想防止这种情况发生。
我想做的是检查计算机的正常运行时间,看看它是否已经运行了 5 分钟,这样自动登录就有机会在程序启动之前完成。我对 bash 还很陌生,解析我从“正常运行时间”中得到的信息,以便我可以用它来进行比较,这似乎超出了我的能力范围。
有人能帮忙吗?也许有更好的解决方案。我被困住了。
答案1
对于您尝试解决的问题,bash 脚本/cron 作业不是正确的解决方案。实际上,请忽略它 -二bash 脚本/cron 作业不是解决您问题的错误方法。;)
您要解决的问题是“确保任务在用户登录后开始运行,并确保它保持运行状态”。这是 upstart 的工作。
下面的命令应该可以满足您的要求,它会进入 /etc/init/。将文件命名为 user-session-job.conf。
description "Keep my very important program running"
start on desktop-session-start
stop on desktop-shutdown
respawn
script
/path/to/my/very/important/program
end script
请参阅 upstart cookbook 获取更多帮助: http://upstart.ubuntu.com/cookbook/
答案2
由于我不得不对原始脚本进行大幅度修改,因此我决定将其作为单独的答案发布。我不确定上面的代码为什么不起作用。我很抱歉,我应该在发布之前对其进行测试。但是,我已经验证了下面的代码确实有效。
#!/bin/bash
upSeconds="$(cat /proc/uptime | grep -o '^[0-9]\+')"
upMins=$((${upSeconds} / 60))
if [ "${upMins}" -gt "5" ]
then
echo "Up for ${upMins} minutes"
else
echo "Up five minutes or less"
fi
答案3
这已经足够了:
test $(cut -d '.' -f1 /proc/uptime) -gt 300
脚本示例:
if test $(cut -d '.' -f1 /proc/uptime) -gt 300; then
echo "booted > 5 minutes ago"
else
echo "booted <= 5 minutes ago"
fi
答案4
#!/bin/bash
#
# upt - show just the system uptime, days, hours, and minutes
let upSeconds="$(cat /proc/uptime) && echo ${temp%%.*})"
let secs=$((${upSeconds}%60))
let mins=$((${upSeconds}/60%60))
let hours=$((${upSeconds}/3600%24))
let days=$((${upSeconds}/86400))
if [ "${days}" -ne "0" ]
then
echo -n "${days}d"
fi
echo -n "${hours}h${mins}m"