How to shield the kill output [duplicate]

2020-02-05 04:46发布

问题:

I run a script like:

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

I dont want the script show the output like:

line 51: 22943 Killed  sleep

I have no idea why this happen, I have redirect the output to /dev/null

回答1:

The message isn't coming from either kill or the background command, it's coming from bash when it discovers that one of its background jobs has been killed. To avoid the message, use disown to remove it from bash's job control:

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


回答2:

This can be done using 'wait' + redirection of wait to /dev/null :

sleep 2 &
PID=$!
kill -9 $PID
wait $PID 2>/dev/null
sleep 2
sleep 2
sleep 2

This script will not give the "killed" message:

-bash-4.1$ ./test
-bash-4.1$ 

While, if you try to use something like:

sleep 2 &
PID=$!
kill -9 $PID 2>/dev/null
sleep 2
sleep 2
sleep 2

It will output the message:

-bash-4.1$ ./test
./test: line 4:  5520 Killed                  sleep 2
-bash-4.1$

I like this solution much more than using 'disown' which may have other implications.

Idea source: https://stackoverflow.com/a/5722850/1208218



回答3:

Another way to disable job notifications is to put your command to be backgrounded in a sh -c 'cmd &' construct.

#!/bin/bash

# ...

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

# ...


回答4:

I was able to accomplish this by redirecting the output of the command that I am running in the background. In your case it would look like:

sleep 20 >>${LOG_FILE} 2>&1 &

... or if you do not want a log file:

sleep 20 &> /dev/null &

Then, when you want to kill that background process' PID, it will not show on standard out.