use strict; use warnings; setpgrp $$, 0; system("sleep.pl"); END {kill 15, -$$}
But if you need this approach, you are doing something wrong. You must not do this. Launch and destroy your killing process correctly.
$ perl -e 'system("sleep 100")' & [1] 11928 $ ps f PID TTY STAT TIME COMMAND 4564 pts/1 Ss 0:01 /bin/bash 11928 pts/1 S 0:00 \_ perl -e system("sleep 100") 11929 pts/1 S 0:00 | \_ sleep 100 11936 pts/1 R+ 0:00 \_ ps f $ kill %1 [1]+ Terminated perl -e 'system("sleep 100")' $ ps f PID TTY STAT TIME COMMAND 4564 pts/1 Rs 0:01 /bin/bash 11949 pts/1 R+ 0:00 \_ ps f
How it works? Shell (bash in my case) should set your process as a group leader if you run in the background. Then if you use kill %? , the syntax shell kills the group correctly. Compare this:
$ perl -e 'system("sleep 100")' & [1] 12109 $ ps f PID TTY STAT TIME COMMAND 4564 pts/1 Rs 0:01 /bin/bash 12109 pts/1 S 0:00 \_ perl -e system("sleep 100") 12113 pts/1 S 0:00 | \_ sleep 100 12114 pts/1 R+ 0:00 \_ ps f $ kill 12109 [1]+ Terminated perl -e 'system("sleep 100")' $ ps f PID TTY STAT TIME COMMAND 4564 pts/1 Ss 0:01 /bin/bash 12124 pts/1 R+ 0:00 \_ ps f 12113 pts/1 S 0:00 sleep 100
But kill %? works as follows:
$ perl -e 'system("sleep 100")' & [1] 12126 $ ps f PID TTY STAT TIME COMMAND 4564 pts/1 Rs 0:01 /bin/bash 12126 pts/1 S 0:00 \_ perl -e system("sleep 100") 12127 pts/1 S 0:00 | \_ sleep 100 12128 pts/1 R+ 0:00 \_ ps f $ kill -12126 [1]+ Terminated perl -e 'system("sleep 100")' $ ps f PID TTY STAT TIME COMMAND 4564 pts/1 Ss 0:01 /bin/bash 12130 pts/1 R+ 0:00 \_ ps f
Hynek -Pichi- Vychodil
source share