bash脚本的时间限制

bash脚本的时间限制

我有 bash 脚本,我想为其设置时间限制。例如,如果脚本运行时间超过 50 秒,则以 0 退出。它应该在脚本内完成,我无法更改命令如何调用脚本。

最好的方法是什么?

有没有时间陷阱之类的东西?

我可以将所有代码放入循环中,但在这种情况下这不是一个选项。

答案1

你需要一个包装纸。

最明显的一个是重命名原始脚本并在其位置创建一个包装器脚本,该脚本将在超时情况下调用原始脚本。对此的一种变体是创建一个与脚本本身具有不同名称的链接,并且调用脚本的方式将决定其中发生的情况。一会儿就应该清楚了。

如果您的脚本在不带参数的情况下调用,您可以将此内部包装器添加到您的脚本中。它将通过参数timeout中的开关再次调用自身$1

#!/usr/bin/env bash

TIMEOUT=10
WRAPPER=FALSE
if [ "$1" != FALSE ]; then
    timeout "$TIMEOUT" "$0" "$WRAPPER"
    exit
fi

#the proper script
echo Here\'s the original script starting.
sleep 11
echo End of the original script.   

因此,回到之前的解决方案,您可能会用来$0查看脚本是如何调用的。是文件还是链接?

如果您不想或无法创建新的可执行文件/链接,并且原始调用使用参数,则可以使用其他开关。例如,可以使用临时文件。这将涉及一些极端情况,需要清理该文件,以防出现问题。您还可以使用 PPID 作为开关。如果父级的命令与子级的命令相同,则它会正确执行脚本,否则它会在超时后自行执行。

答案2

似乎它已经在其他地方得到了回答,但这就是你可以做的。

这是一个返回该命令已经运行了多少秒的命令(添加的sin times 仅返回秒)。

ps -p "<process-id>" -o times=

您可能还需要

pgrep <name-of-the-script>

或者,总的来说,

ps -p "$(<name-of-the-script>)" -o times=

获取进程ID。

然后,将结果分配给一个变量并根据需要经常检查它。

相关内容