Как каким-то хитрым способом убить все процессы, запускаемые горячей клавишей?

Я хочу убить процесс и его дочерний процесс с помощью команды 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, более безопасным способом.

если вы отправляете bash в фоновый режим с помощью &, ^C обрабатывается вашим текущим bash, а не тем, у которого есть ловушка.

criztovyl 07.05.2022 10:17

Другой способ вместо trap , чтобы убить waiting.sh процесс, работающий в фоновом режиме, когда Ctrl + C печатает?

showkey 07.05.2022 10:21

да, поставить ловушку в "текущей" башке: trap "kill %1" INT, bash waiting.sh &. Если вы затем нажмете Ctrl-C, первому процессу в фоновом режиме (%1) будет отправлен сигнал SIGTERM (отправляет сигнал по умолчанию kill).

criztovyl 07.05.2022 10:33

Я делаю, как вы говорите, это не сработает.

showkey 07.05.2022 10:38

пожалуйста, расширьте вопрос, как это не работает должным образом.

criztovyl 07.05.2022 10:41
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
93
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

попробуй использовать trap "pkill -P $$" SIGINT

Сигнал SIGINT от ctrl+c и при выполнении команды pkill все связанные процессы будут уничтожены.

Пожалуйста, попробуйте на своем компьютере, как моя попытка, бесполезно для trap "pkill -P $$" SIGINT, чтобы убить сам процесс и его реальный процесс.

showkey 04.05.2022 16:42

Если все, что вы хотели сделать, это убить процесс 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 перепишите оператор привязки, что не является хорошей практикой.

showkey 07.05.2022 14:13

Новая проблема, связанная с этим сообщением, stackoverflow.com/questions/72153177/….

showkey 07.05.2022 15:56
pid=$$;trap " pkill -P $pid;kill $pid " EXIT не надо оставлять ,они не могут работать,лучше убрать их в скрипте,уберите пожалуйста и я дам бонус.
showkey 08.05.2022 08:58
Ответ принят как подходящий

Из расширенного контекста, который вы предоставили, первое, что приходит мне в голову, это использование 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, решите проблему с помощью вашего метода, а не других.

showkey 10.05.2022 09:15

Другие вопросы по теме