Я хочу убить процесс и его дочерний процесс с помощью команды trap:
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
Как убить все процессы ловушкой?
Чтобы сделать мой запрос более конкретным, покажите мою ОС и среду рабочего стола.
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
, но так и не сделал. Чтобы убить ffmpeg
, откройте терминал и введите команды:
ps aux |grep [f]fmpeg #get ffmpeg's pid
kill pid_number #close the process
Поэтому я хочу улучшить код, чтобы убить процесс, запущенный ctrl+shift+r
, более безопасным способом.
Другой способ вместо trap , чтобы убить waiting.sh
процесс, работающий в фоновом режиме, когда Ctrl + C печатает?
да, поставить ловушку в "текущей" башке: trap "kill %1" INT
, bash waiting.sh &
. Если вы затем нажмете Ctrl-C, первому процессу в фоновом режиме (%1
) будет отправлен сигнал SIGTERM
(отправляет сигнал по умолчанию kill
).
Я делаю, как вы говорите, это не сработает.
пожалуйста, расширьте вопрос, как это не работает должным образом.
попробуй использовать trap "pkill -P $$" SIGINT
Сигнал SIGINT от ctrl+c и при выполнении команды pkill
все связанные процессы будут уничтожены.
Пожалуйста, попробуйте на своем компьютере, как моя попытка, бесполезно для trap "pkill -P $$" SIGINT
, чтобы убить сам процесс и его реальный процесс.
Если все, что вы хотели сделать, это убить процесс 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
Действие привязки настолько тесно связано с конкретной функцией, что если функция в cr.sh
другая, вместо ffmpeg
перепишите оператор привязки, что не является хорошей практикой.
Новая проблема, связанная с этим сообщением, stackoverflow.com/questions/72153177/….
pid=$$;trap " pkill -P $pid;kill $pid " EXIT
не надо оставлять ,они не могут работать,лучше убрать их в скрипте,уберите пожалуйста и я дам бонус.
Из расширенного контекста, который вы предоставили, первое, что приходит мне в голову, это использование PID-файла и сопутствующей команды.
Что-то вроде этого:
# cr.sh
ffmpeg ... &
# note down pid
echo $! >/tmp/cr.pid
# cr-stop.sh
kill $(cat /tmp/cr.pid)
тогда вы сможете использовать cr-stop.sh
, чтобы остановить ffmpeg.
Я дал неправильный бонус, привязка клавиш не может вступить в силу при запуске процесса демона с помощью горячей клавиши в lxde-rc.xml, решите проблему с помощью вашего метода, а не других.
если вы отправляете bash в фоновый режим с помощью &, ^C обрабатывается вашим текущим bash, а не тем, у которого есть ловушка.