有没有办法创建一个只运行X小时的bash脚本?

时间:2013-07-23 18:01:14

标签: bash scripting

有没有办法创建一个只运行X小时的bash脚本?我目前正在设立一个cron工作,每晚都会启动一个脚本。该脚本基本上运行直到满足某个条件,将其状态导出到保持变量以跟踪每次迭代后的“它在哪里”。目的是每晚启动过程,运行几个小时,然后停止,保持状态,直到第二天晚上的过程开始。

如果没有某种方式收集开始时间,并在循环的每次迭代中根据当前时间检查它,是否有更简单的方法来执行此操作? Bash脚本不是我的强项(我知道已经完成并且很危险)并且我之前没有做过类似的事情。任何帮助,将不胜感激。感谢。

3 个答案:

答案 0 :(得分:1)

按照你的描述去做 - 这是最干净的方式。

但是如果出于某种奇怪的原因想要在一段时间后杀掉这个过程,可以使用下一个

./long_runner &
(sleep 5; kill $!; wait; exit 0) &

将在5秒后终止long_runner

答案 1 :(得分:1)

使用GNU Coreutils

GNU coreutils包含一个实际的 timeout 二进制文件,通常会像这样调用:

# timeout after 5 seconds when sleeping for 30
/usr/bin/timeout 5s /bin/sleep 30

在您的情况下,您需要指定小时而不是秒,因此要在2小时内超时,请使用2h而不是5s。有关其他选项,请参阅timeout(1)或info coreutils 'timeout invocation'

黑客和解决方法

本机超时或GNU超时命令确实是最佳选择。但是,如果您决定推出自己的想法,请参阅以下内容:

  1. How do I run a command, and have it abort (timeout) after N seconds?
  2. TMOUT variable使用读取并处理或命令替换。

答案 2 :(得分:0)

通过使用SIGALRM工具,您可以在一段时间后设置要发送的信号,但传统上,这不容易从shell脚本访问(人们会为此编写小型自定义C或Perl程序)。这些天,GNU coreutils附带timeout命令,它通过包装命令来执行此操作:

timeout 4h yourprogram