【发布时间】:2019-01-24 04:54:59
【问题描述】:
我正在一个子 shell 中运行一个进程,该进程可能会或可能不会挂起,然后如果该进程在 10 秒后仍在运行,则终止该进程。
这样做时,我将stdout 和stderr 与> /dev/null 2>&1 连接到/dev/null,这似乎可行。但是,无论我使用什么命令,kill 命令的输出都会在我的下一个命令之后打印到stdout。
[me@test] (Command_That_May_Hang.sh)&
[me@test] X=$!
[me@test] (sleep 10 && kill -9 $! > /dev/null 2>&1)&
[me@test] ps
> PID TTY TIME CMD
> 22741 pts/1 00:00:00 bash
> 27585 pts/1 00:00:00 ps
> [1]+ Killed Command_That_May_Hang.sh > /dev/null 2>&1
我尝试将/dev/null 2>&1 移动到() 的外部,甚至在& 之后,结果没有任何变化。作为参考,这些迭代看起来像:
(sleep 10 && kill -9 $!) > /dev/null 2>&1 &
(sleep 10 && kill -9 $!)& > /dev/null 2>&1
执行进程然后杀死它都成功,似乎我只能暂时抑制输出,这是一种奇怪的行为。任何有关正确将输出发送到 /dev/null 的帮助将不胜感激。
【问题讨论】:
-
我没有看到来自
kill的任何输出。你指的是什么? -
您的重定向仅适用于它们所针对的单个命令。如果你想抑制来自
Command_That_May_Hang的输出,那么你需要运行Command_That_May_Hang >/dev/null 2>&1。抑制来自kill的输出不会影响作为该kill的目标 的单独程序是否写入输出。 -
nit:“我管道标准输出和标准错误”不正确。您正在将 stdout 和 stderr 重定向到 /dev/null。不涉及管道。
标签: bash