( 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 .....
我试图重定向但没有成功。任何想法?谢谢
( 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 .....
我试图重定向但没有成功。任何想法?谢谢
我以其他方式解决了自己,我想分享......也许将来有人会需要。这将允许 ./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
该消息显然来自外壳的作业控制功能。在父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 5
exec 的替身。唯一明显的区别是我只看到“终止”这个词作为通知。)
一个更简单的解决方案(取决于您的平台)可能是使用该timeout
命令。
$ /usr/bin/timeout 30 /path/to/exec
/path/to/exec
这将在 30 秒后停止该过程。
如果我使用timeout 2>/dev/null 1 sleep 2
,我会得到一个“Killed”响应。这可能与您使用方法的位置相同...
如果您在 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
它还禁止显示“已终止”/“已终止”消息。