0
( cmdpid=$BASHPID; (sleep 3; kill $cmdpid) & exec ./myscript )

这是有效的,但我不知道如何抑制杀死消息

line 80: 30631 Terminated              
( cmdpid=$BASHPID; ( sleep 3; kill $cmdpid 2> /dev/null 0<&1 2>&1 ) & exec .....

我试图重定向但没有成功。任何想法?谢谢

4

4 回答 4

1

我以其他方式解决了自己,我想分享......也许将来有人会需要。这将允许 ./script 超时执行并捕获它的输出,包括错误。

我无法解决的小缺点是,如果发生任何事件(如超时或其他错误),则以任何其他方式向主 $shell 发出信号,而不是将结果附加到带有 echo 的 $OUT 中。我想这是 bash 编程中最愚蠢的部分(在大多数其他部分中),每个 () 在它自己的 pid 和隔离变量中构造。无论如何,请享受。

OUT=$((./script) & pid=$!
    # will exit 128 + (signal number)

    (sleep $RUN_TIMEOUT && kill -HUP $pid) 2>/dev/null & watcher=$!  

    if wait $pid; status=$?; then
        if [[ $status -eq 129 ]]; then # 129 -> OK (hangup, means timeout)
            echo "execution_timeout"
        else
            # other, including 255 -> return error
            echo "execution_error"

        fi
    fi # 0 -> normal return, success

    pkill -HUP -P $watcher    
    wait $watcher    

) 2>&1 # + stderr  
于 2013-11-18T11:49:39.283 回答
0

该消息显然来自外壳的作业控制功能。在shell 中禁用它似乎有效:

set +m
( cmdpid=$BASHPID; (sleep 3; kill $cmdpid) & exec ./myscript )

该消息不是来自kill,而是来自执行kill. 尝试

( cmdpid=$BASHPID; (sleep 3; kill $cmdpid) 2> /dev/null & exec ./myscript )

其他尝试:

( set +m; cmdpid=$BASHPID; (sleep 3; kill $cmdpid) & sleep 5 )
( cmdpid=$BASHPID; (sleep 3; kill $cmdpid); disown %%  & sleep 5 )
( cmdpid=$BASHPID; (sleep 3; kill $cmdpid); disown %1  & sleep 5 )

(我用作sleep 5exec 的替身。唯一明显的区别是我只看到“终止”这个词作为通知。)

于 2013-11-15T14:04:54.993 回答
0

一个更简单的解决方案(取决于您的平台)可能是使用该timeout命令。

$ /usr/bin/timeout 30 /path/to/exec

/path/to/exec这将在 30 秒后停止该过程。

如果我使用timeout 2>/dev/null 1 sleep 2,我会得到一个“Killed”响应。这可能与您使用方法的位置相同...

于 2013-11-16T03:50:26.707 回答
0

如果您在 Linux 上可以使用命令超时,则可以按如下方式实现:

timeout --foreground <time in seconds> <command>

从手册页:

       --foreground

          when not running timeout directly from a shell prompt,

          allow COMMAND to read from the TTY and get TTY signals; in this mode, children of COMMAND will not be timed out

它还禁止显示“已终止”/“已终止”消息。

于 2016-11-14T09:06:59.950 回答