正常运行时间 >= 20 分钟时运行命令

Pet*_*ikh 1 bash scripts uptime

我需要在正常运行时间 >= 20 分钟(例如)时运行 BASH 脚本。我该怎么做?

请帮我创建脚本以检查系统正常运行时间并检查正常运行时间是否超过 20 分钟 - 运行另一个脚本。

谢谢。

Rin*_*ind 10

无需知道 20 分钟何时过去。命令“at”可用于告诉系统在某个时刻(并且该时刻可以是(重新)启动)后的 20 分钟内执行某些操作。

/etc/crontab@reboot {user} /usr/local/bin/script.sh,使/usr/local/bin/script.sh可执行文件。将 {user} 更改为用户名或“root.user”。

创建/usr/local/bin/script.sh,当你把它放进去......

 at -f /usr/local/bin/script2.sh now + 20 minutes
Run Code Online (Sandbox Code Playgroud)

/usr/local/bin/script2.sh将在(重新)启动后 20 分钟执行。实际时间范围可能会有所不同(因为在执行“crontab”之前启动过程可能已经在进行中。只是一个示例,但这是创建此类事件的通用方法。

/usr/local/bin/script2.sh 可用于添加更多具有相似起点的行(重新启动后 40 分钟等)

这将在重新启动后继续存在!所以 20 分钟内重启 5 次 = 执行 5 次。嗯……不过还是把它留在这里。


另一种方法:

如果您需要从脚本本身执行此操作,您还可以创建一个要包含在脚本中的变量。第一个简单的例子:

$uptime
 16:11:31 up 1 day,  7:35,  2 users,  load average: 0,10, 0,07, 0,06
~/tmp$ more test
uptime
~/tmp$ more test2
minutes=20;
at -f test now + $minutes minutes
Run Code Online (Sandbox Code Playgroud)

执行./test2将显示

warning: commands will be executed using /bin/sh
job 7 at Tue Oct 20 16:29:00 2015
Run Code Online (Sandbox Code Playgroud)

现在您需要做的就是将“分钟”更改为基于例如“正常运行时间”的变量。

这是在变量“minutes”中获取以分钟为单位的正常运行时间的示例:

 minutes=`awk '{print $0/60;}' /proc/uptime`;
Run Code Online (Sandbox Code Playgroud)

这是一种使其成为条件的方法:

#!/bin/bash
minutes=`awk '{print $0/60;}' /proc/uptime`;
if [ $(echo "$minutes > 20" | bc) -ne 0  ]
then
  at -f test now + 20 minutes
fi
Run Code Online (Sandbox Code Playgroud)
  • 如果分钟大于 20,则在 20 分钟后执行脚本。

使用纯 bash:

#!/bin/bash
read -d. seconds < /proc/uptime
if (( $seconds > 20*60 ))
then
  at -f test now + 20 minutes
fi
Run Code Online (Sandbox Code Playgroud)

这应该让你开始。

  • @PetroPikh 我很困惑,在不付出任何努力的情况下,你如何得到一个漂亮的答案,甚至还敢抱怨。 (7认同)
  • 使用 `at` 的问题是它假设启动时间 20 分钟后正常运行时间为 20 分钟。如果由于某种原因再次重启,例如,在第一次重启后 15 分钟,作业将运行不到 5 分钟的正常运行时间。 (2认同)
  • @MontyHarder 我认为最简单的解决方案是完全避免使用 `at`。该脚本可以简单地在后台启动一个子shell,然后让该子shell休眠20分钟,然后再做任何事情。 (2认同)