首页 > 解决方案 > 下一个命令后显示后台进程标准输出

问题描述

我正在一个子shell中运行一个进程,该进程可能会或可能不会挂起,然后如果该进程在10秒后仍在运行,则终止该进程。

这样做时,我使用管道stdoutstderr/dev/null 连接> /dev/null 2>&1,这似乎有效。stdout但是,无论我使用什么命令,kill 命令的输出都会打印到我的下一个命令之后。

[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将不胜感激。

标签: bash

解决方案


该消息由 bash 本身打印,而不是由kill命令打印。因此,您不能通过重定向脚本中的任何输出来抑制它。

您可以做的是通过执行禁用作业控制的监视模式

set +m

引用 bash 手册页:

-m监控模式。作业控制已启用。对于支持它的系统上的交互式 shell,默认情况下此选项处于启用状态(请参阅上面的 JOB CONTROL)。所有进程都在一个单独的进程组中运行。当后台作业完成时,shell 会打印一行包含其退出状态的行。

使用+m监视模式被禁用。


推荐阅读