Bash 如何屏蔽kill输出

Bash 如何屏蔽kill输出,bash,shell,Bash,Shell,我运行的脚本如下: sleep 20 & PID=$! kill -9 $PID >/dev/null 2>&1 我不希望脚本显示如下输出: line 51: 22943 Killed sleep 我不知道为什么会发生这种情况,我已将输出重定向到/dev/null该消息不是来自kill或后台命令,而是来自bash,当它发现其后台作业之一已被终止时。要避免该消息,请使用disown将其从bash的作业控制中删除: sleep 20 & PID=$! dis

我运行的脚本如下:

sleep 20 &
PID=$!
kill -9 $PID >/dev/null 2>&1
我不希望脚本显示如下输出:

line 51: 22943 Killed  sleep

我不知道为什么会发生这种情况,我已将输出重定向到/dev/null

该消息不是来自
kill
或后台命令,而是来自bash,当它发现其后台作业之一已被终止时。要避免该消息,请使用
disown
将其从bash的作业控制中删除:

sleep 20 &
PID=$!
disown $PID
kill -9 $PID

这可以通过使用“wait”+将wait重定向到/dev/null来完成:

sleep 2 &
PID=$!
kill -9 $PID
wait $PID 2>/dev/null
sleep 2
sleep 2
sleep 2
此脚本不会给出“killed”消息:

而如果您尝试使用以下内容:

sleep 2 &
PID=$!
kill -9 $PID 2>/dev/null
sleep 2
sleep 2
sleep 2
它将输出以下消息:

-bash-4.1$ ./test
./test: line 4:  5520 Killed                  sleep 2
-bash-4.1$
我更喜欢这个解决方案,而不是使用可能有其他含义的“否认”


想法来源:

另一种禁用作业通知的方法是将命令放在
sh-c'cmd&'
构造中作为背景

#!/bin/bash

# ...

sh -c '
sleep 20 &
PID=$!
kill -9 $PID # >/dev/null 2>&1
'

# ...

我可以通过重定向我在后台运行的命令的输出来实现这一点。在您的情况下,它看起来像:

sleep 20 >>${LOG_FILE} 2>&1 &
。。。或者,如果不需要日志文件:

sleep 20 &> /dev/null &

然后,当您想要终止后台进程的PID时,它将不会显示在标准输出上。

太好了,这就是我想要的,非常感谢,伙计..disown意味着shell在终止时不会向子进程发送
SIGHUP
,请参阅。下面是。通过将kill-9语句更改为:kill-9$PID 2>/dev/null,这可以稍微改进。这是因为kill还可以输出其他消息,如:第3行:kill:(3968)-根据脚本所做的操作,没有这样的过程。唯一适合我的方法是,
kill-13 PID
,不会生成任何默认的
kill
输出
sleep 20 &> /dev/null &