How to shield the kill output [duplicate]

2020-02-05 04:01发布

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

标签: bash shell
4条回答
The star\"
2楼-- · 2020-02-05 04:31

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楼-- · 2020-02-05 04:45

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
查看更多
Juvenile、少年°
4楼-- · 2020-02-05 04:48

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
'

# ...
查看更多
Anthone
5楼-- · 2020-02-05 04:50

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.

查看更多
登录 后发表回答