如何以某种聪明的方式杀死所有由热键触发的进程?

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

我想用陷阱命令杀死一个进程及其子进程:

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

现在 运行 它在后台:

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

查看所有进程

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

按ctrl+c触发陷阱:

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   

如何使用陷阱杀死所有进程?
为了使我的要求更具体,请显示我的 os 和桌面环境。

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

我将热键与语音捕获绑定,每当在我最喜欢的网站上播放音乐时,单击 ctrl+shift+r,bash 脚本 /usr/hotkey/ch.sh 调用,ffmpeg 运行正在后台,正在捕获音乐,我想在单击时完成音乐捕获ctrl+c,我的脚本失败了。

  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

我试过很多种trap格式,从来没有done.In命令杀死ffmpeg,打开终端并发出命令:

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

所以我想改进代码,以更明智的方式终止由 ctrl+shift+r 触发的进程。

尝试使用trap "pkill -P $$" SIGINT

来自 ctrl+c 的 SIGINT 信号和执行 pkill 命令时,所有相关进程都将被终止。

如果你只想杀死 ffmpeg 进程,你可以这样做吗:

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

然后在终端中,您只需点击 F5 即可终止 ffmpeg 进程。

如果你想杀死cr.sh,那么你可以

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

并输入 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

根据您提供的扩展上下文,我首先想到的是使用 PID-file 和配套命令。

像这样:

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

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

那么你应该可以使用 cr-stop.sh 来停止 ffmpeg。