Как я могу перевести в спящий режим работающее приложение?

15

Пример использования:

Я запускаю Chromium с несколькими открытыми вкладками и решаю, что мне не нужно получать доступ к приложению в течение следующих 20 минут. Чтобы сэкономить время работы ноутбука, я бы хотел перевести Chrome в режим гибернации (заморозить), не закрывая приложение (повторное открытие и повторная загрузка всех вкладок требует времени, которое я хотел бы сэкономить, переведя его в спящий режим).

orschiro
источник
1
Проверьте второй ответ здесь: stackoverflow.com/questions/2134771/… . Дело в том, что хром использует много PID, и каждый раз, когда вы его открываете, они разные ... но остановка основного (тот, у которого в диспетчере процессов есть оригинальный значок), кажется, работает нормально.
GreggD
1
Если вы заботитесь только о Chromium, а не о других приложениях, вы можете использовать расширение Chromium, предназначенное для управления вкладками, например OneTab или Session Buddy .
Моше Кац
Спасибо, но я нахожу killallрешение действительно очень элегантным. :)
orschiro

Ответы:

21

Вы можете использовать killallкоманду, чтобы отправить SIGSTOPсигнал всем процессам, соответствующим заданному имени, чтобы заморозить их, а затем отправить SIGCONTтот же способ, чтобы разморозить их снова.

Сначала узнайте имя процесса, используя pgrep -l SEARCH_PATTERN:

$ pgrep -l chrom
13010 chromium-browse
13036 chromium-browse
13038 chromium-browse
13153 chromium-browse
13166 chromium-browse
13169 chromium-browse
13175 chromium-browse
13187 chromium-browse
13195 chromium-browse
13206 chromium-browse

Обратите внимание, что он обрезает длинные имена, поэтому rотсутствует. Но это не проблема, так как вы можете использовать Tabзавершение, чтобы ввести имя процесса, которое завершит его автоматически.

Затем вы отправляете SIGSTOPсигнал всем процессам, названным chromium-browserтак:

$ killall -s STOP chromium-browser 

Окно Chromium будет серым, как если бы оно перестало отвечать на запросы. Ну, это действительно стало безразличным, так что этого следовало ожидать. Теперь вы не можете взаимодействовать с окном (кроме строки меню, свертывания и т. Д., Которые обрабатываются диспетчером окон, а не самим приложением). Но события от нажатия кнопок и т. Д. По-прежнему генерируются и добавляются в очередь событий приложения, поэтому все они будут обрабатываться сразу, когда вы снова разморозите приложение!

Вы снова размораживаете приложение, просто запустив эту команду, которая отправляет SIGCONTсигнал указанным процессам:

$ killall -s CONT chromium-browser 

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

В редких случаях даже среда рабочего стола / менеджер окон / все остальное также может перестать отвечать. В этом случае вы должны разморозить замороженное приложение через TTY:

Нажмите Ctrl+ Alt+, F1чтобы переключиться на TTY1. Вам будет предложено войти в систему, поэтому введите свое имя пользователя и пароль. Затем выполните команду, чтобы разморозить приложение так же, как вы запускаете его через обычный эмулятор терминала. После этого переключитесь обратно на рабочий стол (TTY7) с помощью Ctrl+ Alt+, F7и у вас все будет хорошо.

Byte Commander
источник
4
Так как вы начали с pgrep, вы могли бы продолжить сpkill
Муру
1
Хотя риск сбоя приложения SIGSTOPсуществует, я бы сказал, что он незначительный. Я часто использовал его на Chromium, и я не помню, чтобы это когда-либо было причиной аварии.
Касперд
Я узнал что-то новое! killall! ;-)
Fabby
8

Чтобы приостановить, попробуйте: killall -SIGTSTP chromium-browser

Если это не сработает, попробуйте силовую версию: killall -SIGSTOP chromium-browser.

В любом случае, продолжать использовать killall -SIGCONT chromium-browser. Я попробовал с Firefox, и это сработало. Учтите, однако, что если вы нажмете кнопки в Chromium, пока он приостановлен, он выполнит эту функцию, как только вы продолжите ее выполнение.

clocktown
источник
3
SIGSTOP / SIGCONT у меня работает, просто нужно ввести chromium-browserкак имя процесса. +1
GreggD
1
Или google-chromeесли вы используете Google Chrome, так как разница, по-видимому, сбивает с толку
кошка
2

Вы можете попробовать следующее (в Терминале):

ps aux | grep gedit

Тогда вы увидите что-то вроде этого:

barend    7166  5.3  1.0 722620 39044 ?        Sl   16:19   0:00 gedit

Запишите номер 7166 (или любой другой номер) и затем выполните:

kill -STOP 7166

Это приостановит выполнение процесса. Он не сразу освобождает используемую им память, но память будет доступна другим процессам, если им это понадобится.

Тогда делай

kill -CONT 7166 снова работать с программой.

Обратите внимание, что вы должны изменить 7166, где это необходимо.

grooveplex
источник