这回答命令行命令自动杀死一个命令后,一定的时间

建议使用1行方法使bash命令行中运行的命令超时:

( /path/to/slow command with options ) & sleep 5 ; kill $!

但是,给定的“长时间运行”命令可能会在超时之前完成。 (让我们称它为“通常运行时间长但有时很快”的命令,或者简称为tlrbsf。)

所以这个漂亮的一行方法有几个问题。 首先,睡眠不是有条件的,因此在序列完成所花费的时间上设置了一个不希望的下界。当tlrbsf命令在2秒内完成时,考虑30秒或2m甚至5m的睡眠时间——这是非常不可取的。 其次,kill是无条件的,因此该序列将尝试kill一个未运行的进程并抱怨它。

所以…

是否有一种方法可以超时一个典型的长时间运行但有时快速(“tlrbsf”)命令

有一个bash实现(另一个问题已经有Perl和C的答案) 将终止在较早的两个:TLRBSF程序终止,或超时过去 不会杀死不存在/不运行的进程(或者,可选:不会抱怨失败的杀死) 不一定非要是一行字 可以在Cygwin或Linux下运行吗

... 还有,为了加分

在前台运行TLRBSF命令 任何“睡眠”或额外的进程在后台

这样,TLRBSF命令的stdin/stdout/stderr可以重定向,就像它已经直接运行吗?

如果是,请分享你的代码。如果不是,请解释原因。

我花了一段时间试图破解前面提到的例子,但我的bash技能达到了极限。


当前回答

简单的脚本,代码清晰。保存到/usr/local/bin/run目录:

#!/bin/bash

# run
# Run command with timeout $1 seconds.

# Timeout seconds
timeout_seconds="$1"
shift

# PID
pid=$$

# Start timeout
(
  sleep "$timeout_seconds"
  echo "Timed out after $timeout_seconds seconds"
  kill -- -$pid &>/dev/null
) &
timeout_pid=$!

# Run
"$@"

# Stop timeout
kill $timeout_pid &>/dev/null

超时一个运行时间过长的命令:

$ run 2 sleep 10
Timed out after 2 seconds
Terminated
$

对于完成的命令,立即结束:

$ run 10 sleep 2
$

其他回答

超时可能是要尝试的第一种方法。如果超时,您可能需要执行通知或其他命令。经过相当多的搜索和实验,我想出了这个bash脚本:

if 
    timeout 20s COMMAND_YOU_WANT_TO_EXECUTE;
    timeout 20s AS_MANY_COMMANDS_AS_YOU_WANT;
then
    echo 'OK'; #if you want a positive response
else
    echo 'Not OK';
    AND_ALTERNATIVE_COMMANDS
fi

如果您已经知道要在超时后终止的程序(假设是程序)的名称(例如3秒),我可以提供一个简单但有点脏的替代解决方案:

(sleep 3 && killall program) & ./program

如果我用系统调用来调用基准测试进程,这将非常有效。

在99%的情况下,答案是不实现任何超时逻辑。超时逻辑在几乎任何情况下都是一个红色警告信号,表明有其他地方出了问题,应该予以修复。

有时你的进程会在n秒后挂起或中断吗?然后找出原因并解决这个问题。

顺便说一句,要正确地执行strager的解决方案,您需要使用等待“$SPID”而不是fg 1,因为在脚本中您没有作业控制(试图打开它是愚蠢的)。此外,fg 1依赖于这样一个事实,即您之前没有在脚本中启动任何其他作业,这是一个糟糕的假设。

我有一个cron工作,调用一个php脚本,有时,它会卡在php脚本。这个解决方案对我来说是完美的。

我使用:

scripttimeout -t 60 /script.php

一个非常简单的方法:

# command & sleep 5; pkill -9 -x -f "command"

使用pkill(选项-f),您可以使用参数终止特定的命令,或指定-n以避免终止旧进程。