0

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

除了以某种方式收集开始时间,并在循环的每次迭代中根据当前时间检查它,有没有更简单的方法来做到这一点?Bash 脚本不是我的强项(我知道的足以完成任务并且很危险)而且我以前没有做过这样的事情。任何帮助,将不胜感激。谢谢。

4

3 回答 3

1

按照你的描述去做——这是最干净的方法。

但是如果由于某种奇怪的原因想在一段时间后终止进程,可以使用下一个

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

将杀死long_runner5秒后。

于 2013-07-23T19:00:51.783 回答
1

使用 GNU Coreutils

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

# 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 timeout 命令确实是最好的选择。但是,如果您决定自己推出一些想法,请参阅以下内容:

  1. 如何运行命令,并在 N 秒后中止(超时)?
  2. 使用读取和进程或命令替换的TMOUT 变量。
于 2013-07-23T19:11:26.487 回答
0

通过使用该SIGALRM工具,您可以设置在特定时间后发送的信号,但传统上,这在 shell 脚本中并不容易访问(人们会为此编写小型自定义 C 或 Perl 程序)。这些天来,GNUcoreutils附带了一个timeout命令,它通过包装你的命令来做到这一点:

timeout 4h yourprogram
于 2013-07-23T19:39:25.460 回答