Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Suppress Notice of Forked Command Being Killed

Tags:

linux

bash

macos

Let's suppose I have a bash script (foo.sh) that in a very simplified form, looks like the following:

echo "hello"
sleep 100 &
ps ax | grep sleep | grep -v grep | awk '{ print $1 } ' | xargs kill -9
echo "bye"

The third line imitates pkill, which I don't have by default on Mac OS X, but you can think of it as the same as pkill. However, when I run this script, I get the following output:

hello
foo: line 4: 54851 Killed                  sleep 100
bye

How do I suppress the line in the middle so that all I see is hello and bye?

like image 776
Chris Bunch Avatar asked Dec 13 '25 20:12

Chris Bunch


2 Answers

While disown may have the side effect of silencing the message; this is how you start the process in a way that the message is truly silenced without having to give up job control of the process.

{ command & } 2>/dev/null

If you still want the command's own stderr (just silencing the shell's message on stderr) you'll need to send the process' stderr to the real stderr:

{ command 2>&3 & } 3>&2 2>/dev/null

To learn about how redirection works:

And by the way; don't use kill -9.

I also feel obligated to comment on your:

ps ax | grep sleep | grep -v grep | awk '{ print $1 } ' | xargs kill -9

This will scortch the eyes of any UNIX/Linux user with a clue. Moreover, every time you parse ps, a fairy dies. Do this:

kill $!

Even tools such as pgrep are essentially broken by design. While they do a better job of matching processes, the fundamental flaws are still there:

  • Race: By the time you get a PID output and parse it back in and use it for something else, the PID might already have disappeared or even replaced by a completely unrelated process.
  • Responsibility: In the UNIX process model, it is the responsibility of a parent to manage its child, nobody else should. A parent should keep its child's PID if it wants to be able to signal it and only the parent can reliably do so. UNIX kernels have been designed with the assumption that user programs will adhere to this pattern, not violate it.
like image 57
lhunath Avatar answered Dec 15 '25 11:12

lhunath


How about disown? This mostly works for me on Bash on Linux.

echo "hello"
sleep 100 &
disown
ps ax | grep sleep | grep -v grep | awk '{ print $1 } ' | xargs kill -9
echo "bye"

Edit: Matched the poster's code better.

like image 34
JasonSmith Avatar answered Dec 15 '25 11:12

JasonSmith



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!