我有 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。
然后,将结果分配给一个变量并根据需要经常检查它。