如何以某种聪明的方式杀死所有由热键触发的进程?
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。
我想用陷阱命令杀死一个进程及其子进程:
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。