3

So, I have some jobs like this:

sleep 30 | sleep 30 &

The natural way to think would be:

kill `jobs -p`

But that kills only the first sleep but not the second.

Doing this kills both processes:

kill %1

But that only kills at most one job if there are a lot of such jobs running.

It shouldn't kill processes with the same name but not run in this shell.

  • killall sleep – DopeGhoti Aug 2 '17 at 17:20
  • What do you do after running sleep 30 | sleep 30? Do you press Control-z and do bg? – Arkadiusz Drabczyk Aug 2 '17 at 17:31
3

Use this:

pids=( $(jobs -p) )
[ -n "$pids" ] && kill -- "${pids[@]/#/-}"

jobs -p prints the PID of process group leaders. By providing a negative PID to kill, we kill all the processes belonging to that process group (man 2 kill). "${pids[@]/#/-}" just negates each PID stored in array pids.

3

A somewhat shorter version of xhienne's answer, but not pure-bash:

jobs -p | xargs -I{} kill -- -{}
2

You can use pkill and pgrep to kill a list of process names.

From the man page:

pgrep looks through the currently running processes and lists the process IDs which matches the selection criteria to stdout. All the criteria have to match. For example, pgrep -u root sshd will only list the processes called sshd AND owned by root. On the other hand, pgrep -u root,daemon will list the processes owned by root OR daemon. pkill will send the specified signal (by default SIGTERM) to each process instead of listing them on stdout.

An example using pgrep, pkill,

$ pgrep -l script.sh
12406 script.sh
12425 script.sh

$ pkill $(pgrep script.sh)

$ cat signal-log
Name: ./script.sh Pid: 12406 Signal Received: SIGTERM
Name: ./script.sh Pid: 12425 Signal Received: SIGTERM
2

Use kill $( jobs -p )... I love it. Use this if you’ve jost got too many jobs for kill’s argv (it can happen I guess):

killalljobs() { for pid in $( jobs -p ); do kill -9 $pid ; done ; }

  • or simply use pkill -s0 as shown here – mosvy Jan 31 at 23:16
  • @mosvy But what about less feature-rich environments, where no pkill/pgrep pair exists? – user2497 Jan 31 at 23:22
  • there you'll have to do it by hand ;-) – mosvy Jan 31 at 23:36
  • @mosvy and in a real hurry:/ – user2497 Jan 31 at 23:41
  • 1
    Notice that kill $(jobs -p) will only kill process leaders ie. it won't kill the sleep in (sleep 3600 &) or (sleep 3600; true) &. That may or may not be what you want. Also busybox has pgrep but no pkill, so kill $(pgrep -s0). – mosvy Jan 31 at 23:44

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.