'How can kill all the processes triggered by hotkey with some smart way?

I want to kill a process and its son process with trap command:

vim   waiting.sh 
trap "kill $$" EXIT
sleep 10000

Now run it in background:

debian@debian:~$  bash   waiting.sh  &
[1] 29590

Have a look at all processes

debian@debian:~$  ps aux | grep '[w]aiting.sh'
debian     29590  0.0  0.0  14556  3164 pts/1    S    16:16   0:00 bash waiting.sh
debian@debian:~$  ps aux | grep '[s]leep'
debian     29591  0.0  0.0  13104   508 pts/1    S    16:16   0:00 sleep 10000

Press ctrl+c to trigger the trap:

debian@debian:~$  ^C
debian@debian:~$  ps aux | grep '[w]aiting.sh'
debian     29590  0.0  0.0  14556  3164 pts/1    S    16:16   0:00 bash waiting.sh
debian@debian:~$  ps aux | grep '[s]leep'
debian     29591  0.0  0.0  13104   508 pts/1    S    16:16   0:00 sleep 10000   

How can kill all the processes with trap?
To make my request more concrete,show my os and desktop environment.

debian@debian:~$  uname -a
Linux debian 5.10.0-11-amd64 #1 SMP Debian 5.10.92-2 (2022-02-28) x86_64 GNU/Linux
debian@debian:~$  dpkg -l lxde
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name           Version      Architecture Description
+++-==============-============-============-=================================
ii  lxde           11           all          metapackage for LXDE
debian@debian:~$  dpkg -l openbox
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name           Version         Architecture Description
+++-==============-===============-============-===============================>
ii  openbox        3.6.1-9+deb11u1 amd64        standards-compliant, fast, ligh

I bind hotkey with voice capture,whenever listen to the music playing on my favorite website,click ctrl+shift+r,the bash script /usr/hotkey/ch.sh called ,ffmpeg running on the background,music captured,i want to finish the music capture when to click ctrl+c,my script failed.

  vim  $HOME/.config/openbox/lxde-rc.xml
  <!-- Keybindings for recording voice playing on sound card-->
    <keybind key="C-S-r">
      <action name="Execute">
      <command>bash /usr/hotkey/cr.sh</command>
      </action>
    </keybind>

  cat  /usr/hotkey/cr.sh
  pid=$$
  trap  " pkill -P $pid;kill $pid " SIGINT
  if [[ -f "/tmp/out.mkv" ]];then  rm -f "/tmp/out.mkv";fi
  voice='alsa_output.pci-0000_09_00.6.analog-stereo.monitor'
  ffmpeg -f pulse -i $voice /tmp/out.mkv

I have tried many kinds of trap format, never done.In order to kill ffmpeg,open a terminal and issue commands:

ps aux |grep [f]fmpeg #get ffmpeg's pid
kill pid_number       #close the process

So i want to improve the code,to kill the process triggered by ctrl+shift+r with more samrt way.



Solution 1:[1]

From the extended context you provided the first thing that comes to my mind is using a PID-file and a companion command.

Something like this:

# cr.sh
ffmpeg ... &
# note down pid
echo $! >/tmp/cr.pid

# cr-stop.sh
kill $(cat /tmp/cr.pid)

then you should be able to use cr-stop.sh to stop ffmpeg.

Solution 2:[2]

try to use trap "pkill -P $$" SIGINT

SIGINT signal from ctrl+c and on execution of pkill command all the related processes will be killed.

Solution 3:[3]

If all you wanted to do is kill ffmpeg process, can you just do :

bind -x '"'$(tput kf5)'":"pkill ffmpeg"'

then in the terminal, you just hit F5 to kill ffmpeg process.

If you want to kill the cr.sh, then you can do

bind -x '"'$(tput kf5)'":"pkill /usr/hotkey/cr.sh"'

and put in cr.sh

if [[ -f "/tmp/out.mkv" ]];then  rm -f "/tmp/out.mkv";fi
voice='alsa_output.pci-0000_09_00.6.analog-stereo.monitor'
ffmpeg -f pulse -i $voice /tmp/out.mkv

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 criztovyl
Solution 2 Sunil
Solution 3