Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 是否可以从bash脚本设置超时?_Linux_Bash_Process_Settimeout - Fatal编程技术网

Linux 是否可以从bash脚本设置超时?

Linux 是否可以从bash脚本设置超时?,linux,bash,process,settimeout,Linux,Bash,Process,Settimeout,有时,我的bash脚本没有明确的原因而挂起 所以它们实际上可以永远挂起(脚本进程将一直运行,直到我杀死它) 是否可以结合bash脚本超时机制,以便在例如½小时后退出程序 如果您有Gnu coreutils,可以使用timeout命令: timeout 1800s ./myscript 要检查是否发生超时,请检查状态代码: timeout 1800s ./myscript if (($? == 124)); then echo "./myscript timed out after 30

有时,我的bash脚本没有明确的原因而挂起

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


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

如果您有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

此仅限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"
#/bin/bash
超时=1800#30分钟
函数超时\u监视器(){
睡眠“$Timeout”
杀死“$1”
}
#在中启动超时监视器
#背景并通过PID:
超时\u监视器“$$”&
超时\u监视器\u pid=$!
# 
#终止时终止超时监视器:
终止“$Timeout\u monitor\u pid”

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

找到错误行为的原因是否更有意义?是的,但我想知道超时选项。好的,制作一个启动包装器:wapper启动您的脚本,获取其进程id,并用它在30分钟后注册cron作业。cron作业在进程id上执行kill命令。嗨,伙计们,你们能发布你们的答案吗?这样我会选择最符合逻辑的答案。后台进程不会让主进程运行吗?这意味着即使脚本已完全执行,也将始终超时?@Alan:是的,它将始终超时。不,主进程将不会保持运行,但后台进程将保持运行。如果这对您来说是个问题,您可以从
$存储后台进程的PID
并在终止主程序之前终止它。或者使用
退出
处理程序。或者按照rici的建议使用Gnu的
timeout
。存储超时监视器PID并终止它应该可以完成这项工作。也许你会考虑把它加入你的答案中,这是第一个出现在谷歌上的答案之一。(我正在记录脚本是否超时,所以如果脚本事先完全执行,我需要后台进程停止)@Alan:好的,按照你的建议,增加了对监视器的杀戮。是否可以在超时发生时将某些内容记录到文件中?