Графическая отправка сигналов SIGSTOP или SIGCONT (аналогично xkill)

Вопрос

Знаете ли вы какой-либо инструмент / скрипт для отправки SIGSTOP (чтобы приостановить процесс) или SIGCONT (чтобы возобновить его) для процесса, нажав на графическое окно, созданное процессом?

Некоторый контекст

Уже есть инструмент под названием xkill который убивает программы нажатием на окно, но у него нет опций для отправки определенного сигнала. Это жаль, потому что несколько связанных инструментов командной строки, таких как kill есть эта опция.

Обычно я делаю это через командную строку, вручную получая соответствующие имена процессов и используя такие инструменты, как kill, pkill или же killall но было бы неплохо сделать это графически, аналогично нажатию на окно с xkill инструмент.

Приложения

Я нашел бы такой инструмент очень полезным для графической приостановки некоторых тяжелых процессов, когда процессор слишком "нагружен", не прерывая их и не теряя данные, которые не могут быть сохранены (например, для частичных результатов длинных вычислений).

1 ответ

Решение

Ты можешь использовать xdotool чтобы позволить пользователю щелкнуть окно и получить его идентификатор процесса. Тогда вы можете использовать kill отправлять, например, сигналы STOP или CONT этому процессу и таким образом замораживать / оттаивать.

Во-первых, вам, вероятно, придется установить xdotoolпредустановлен:

sudo apt install xdotool

Тогда команда для получения PID процесса, владеющего конкретным окном, которое можно выбрать щелчком мыши, будет выглядеть так:

xdotool selectwindow getwindowpid

Это печатает числовой идентификатор процесса. Вы можете использовать поставку в качестве аргумента kill -STOP или же kill -CONT приостановить и продолжить указанный процесс. Это можно упростить, сохранив PID в переменной, как в этом небольшом скрипте ниже, который приостанавливает процесс щелкающего окна на 5 секунд:

#!/bin/bash
wpid="$(xdotool selectwindow getwindowpid)"
kill -STOP "$wpid"
sleep 5
kill -CONT "$wpid"

Теперь вы можете сохранить этот скрипт на своем компьютере и, например, привязать его к сочетанию клавиш.

Замечания: man xdotool говорит о getwindowpid субкоманда:

"Это требует усилий со стороны приложения, владеющего окном, и может работать не для всех окон".

Другими словами, он может не работать вообще или, по крайней мере, не совсем так, как предполагалось для некоторых приложений.
Может также случиться, что несколько окон имеют одинаковый соответствующий идентификатор процесса, как, например, все экземпляры gnome-терминала принадлежат одному и тому же родителю. В этом случае команда заморозит их всех, что может быть не предназначено.

Улучшение Byte Commander♦ ответ:

Для этого есть скрипт на основе xdtool: https://github.com/RegisterFault/clickstop

Скрипт Bash, использующий xdotool для отправки сигналов SIGSTOP и SIGCONT в дерево процессов приложения, по которому щелкнули

Преимущество состоит в том, что он приостановит все дерево процессов, что необходимо, например, для приостановки многопроцессорных Chrome или Firefox.

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