【问题标题】:Is it possible to set time out from bash script? [duplicate]是否可以从 bash 脚本设置超时? [复制]
【发布时间】:2015-05-09 18:28:21
【问题描述】:

有时我的 bash 脚本在没有明确原因的情况下挂起并保持

所以他们实际上可以永远挂起(脚本进程将一直运行,直到我杀死它)

是否可以结合 bash 脚本超时机制以便在例如 ½ 小时后退出程序?

【问题讨论】:

  • 找出错误行为的原因不是更有意义吗?
  • 是的,但我想知道超时选项。
  • 好吧,创建一个启动包装器:该 wapper 启动您的脚本,获取它的进程 ID 并使用它在 30 分钟后注册一个 cron 作业。 cron 作业对进程 id 执行 kill 命令。
  • 嗨伙计们,你能发布你的答案,所以我会选择最合乎逻辑的答案

标签: linux bash process settimeout


【解决方案1】:

如果你有 Gnu coreutils,你可以使用timeout 命令:

timeout 1800s ./myscript

要检查是否发生超时,请检查状态码:

timeout 1800s ./myscript

if (($? == 124)); then
  echo "./myscript timed out after 30 minutes" >>/path/to/logfile
  exit 124
fi

【讨论】:

  • 是否可以在超时发生时将某些内容记录到文件中?
【解决方案2】:

这种仅限 Bash 的方法通过将函数作为后台作业运行以强制超时,从而将所有超时代码封装在脚本中:

#!/bin/bash

Timeout=1800 # 30 minutes

function timeout_monitor() {
   sleep "$Timeout"
   kill "$1"
}

# start the timeout monitor in 
# background and pass the PID:
timeout_monitor "$$" &
Timeout_monitor_pid=$!

# <your script here>

# kill timeout monitor when terminating:
kill "$Timeout_monitor_pid"

请注意,该函数将在单独的进程中执行。因此,必须传递被监视进程的 PID ($$)。为了简洁起见,我省略了通常的参数检查。

【讨论】:

  • 后台进程会不会保持主进程运行?这意味着即使脚本已完全执行,这总是会超时?
  • @Alan:是的,它总是会超时。不,主进程不会继续运行,但后台进程会。如果这对您来说是个问题,您可以从$! 存储后台进程的 PID,并在终止主程序之前将其终止。或者使用EXIT 处理程序。或者按照 rici 的建议使用 Gnu 的 timeout
  • 是的 - 很好的答案。存储 timeout_monitor PID 并杀死它应该可以完成这项工作。可能会考虑将其纳入您的答案,这是谷歌上第一个出现的问题。 (我正在记录脚本是否超时,所以如果脚本事先完整执行,我需要后台进程终止)
  • @Alan: 好的,听从你的建议,增加了对监视器的杀戮。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-09
  • 2020-11-08
  • 2012-10-18
  • 2012-02-21
  • 1970-01-01
  • 2014-11-03
  • 1970-01-01
相关资源
最近更新 更多