【问题标题】:Preventing "Terminated" message when killing subprocess杀死子进程时防止“终止”消息
【发布时间】:2015-08-27 13:44:40
【问题描述】:

我正在寻找像 Linux 的“超时”命令这样的工具,它允许 timuet 值小于 1 秒。我正在使用解决方案here,但遇到了一个问题。

问题是它有时会打印此消息,而我正试图找出原因。

./tools/utimeout.sh: line 17: 12369 Terminated              $(./tools/usleep $TIMEOUT ; kill $PROC &> /dev/null)

我尝试修改解决方案,以便在脚本退出之前终止子进程,但这没有帮助。

#!/bin/bash

TIMEOUT=400000

#execute command in background
"$@" &

#get process ID
PROC=$! 

#sleep for 10 milliseconds then kill command
(./tools/usleep $TIMEOUT ; kill $PROC &> /dev/null) & 

CPROC=$!
wait $PROC &> /dev/null
kill $CPROC &> /dev/null

if [ $? -eq 1 ]; then
    # echo "Process timed out."
    exit 1
else
    # echo "Process completed successfully."
    exit 0
fi

由于我想从此脚本中捕获 stderr,作为解决方法,我只是使用 sed 从错误日志中删除消息。由于这是一个 hack,我希望找到更好的解决方案。

【问题讨论】:

  • 请改用"$@" &,否则您的脚本将无法处理包含空格和模式特殊字符的参数。
  • 另外,不要使用命令替换定时器进程;只需使用子shell:(./tools... ) &.
  • my timeout 命令接受小于 1 的浮点秒数。(fedora 21)。
  • 你是对的。 (facepalm) 我想可能让我感到困惑的是,在 Ubuntu 中,似乎没有“usleep”命令。也许我感到困惑并在我的脑海中混淆了,认为没有允许时间少于一秒的超时命令。

标签: bash timeout


【解决方案1】:

为避免该消息,您可以否认该过程

(./tools/usleep $TIMEOUT ; kill $PROC &> /dev/null) &
disown %

然后你不能等待它,或者你可以把它放在一个子shell中:

( (./tools/usleep $TIMEOUT ; kill $PROC &> /dev/null) & )

但是当然你不能把它当作 $!不会是对的。


我的 fedora 21 超时需要浮点持续时间:

$ time timeout .1 sleep 1
real    0m0.103s
user    0m0.002s
sys     0m0.002s

【讨论】:

  • 什么是'disown'后的%?
  • disown 获取 jobspecs 列表,说明将其应用于哪些工作。 % 启动每个作业规范,其本身仅表示当前作业(最后放在后台)。这里实际上不需要它,因为没有参数的disown 默认也适用于当前作业。在man bash中搜索jobspec。
猜你喜欢
  • 2011-05-08
  • 2012-09-19
  • 2017-07-27
  • 1970-01-01
  • 2022-01-18
  • 1970-01-01
  • 2013-02-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多