Jak mogę hibernować działającą aplikację?

16

Przykład zastosowania:

Uruchamiam Chromium z kilkoma otwartymi kartami i stwierdzam, że nie potrzebuję uzyskiwać dostępu do aplikacji przez następne 20 minut. Aby zaoszczędzić czas baterii laptopa, chciałbym hibernować (zamrozić) Chromium bez konieczności zamykania aplikacji (ponowne otwieranie i ponowne ładowanie wszystkich kart wymaga czasu, który chciałbym zaoszczędzić przez hibernację).

orschiro
źródło
1
Sprawdzić drugą odpowiedź tutaj: stackoverflow.com/questions/2134771/... . Chodzi o to, że chrom używa wielu PID, a te są różne przy każdym otwarciu ... ale zatrzymanie głównego (tego z oryginalną ikoną w menedżerze procesów) wydaje się działać dobrze.
GreggD,
1
Jeśli zależy Ci tylko na Chromium, a nie na innych aplikacjach, możesz użyć rozszerzenia Chromium przeznaczonego do zarządzania kartami , takiego jak OneTab lub Session Buddy .
Moshe Katz
Dziękuję, ale uważam, że killallrozwiązanie jest naprawdę bardzo eleganckie. :)
orschiro

Odpowiedzi:

22

Możesz użyć killallpolecenia, aby wysłać SIGSTOPsygnał do wszystkich procesów pasujących do danej nazwy, aby je zamrozić, a następnie wysłać w SIGCONTten sam sposób, aby je ponownie rozmrozić.

Najpierw sprawdź nazwę procesu, używając 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

Pamiętaj, że przycina długie nazwy, dlatego rbrakuje. Nie stanowi to jednak problemu, ponieważ można użyć Tabuzupełniania, aby wprowadzić nazwę procesu, która zakończy ją automatycznie.

Następnie wysyłasz SIGSTOPsygnał do wszystkich procesów o chromium-browsertakich nazwach :

$ killall -s STOP chromium-browser 

Okno Chromium wyszarzy się, jakby przestało odpowiadać. Cóż, naprawdę przestało odpowiadać, więc należało się tego spodziewać. Nie możesz teraz w żaden sposób wchodzić w interakcje z oknem (z wyjątkiem paska menu i minimalizowania itp., Które są obsługiwane przez menedżera okien, a nie samą aplikację). Ale zdarzenia z klikania przycisków itp. Są nadal generowane i dodawane do kolejki zdarzeń aplikacji, więc wszystkie zostaną przetworzone jednocześnie, gdy ponownie rozmrozisz aplikację!

Aplikację ponownie rozmrażasz, po prostu uruchamiając polecenie, które wysyła SIGCONTsygnał do określonych procesów:

$ killall -s CONT chromium-browser 

Czasami zawieszenie aplikacji w ten sposób może spowodować awarię, więc upewnij się, że ważne rzeczy zostały zapisane przed zawieszeniem aplikacji.

W rzadkich przypadkach nawet środowisko pulpitu / menedżer okien / cokolwiek innego może również przestać odpowiadać. W takim przypadku musisz rozmrozić zamrożoną aplikację za pomocą TTY:

Naciśnij Ctrl+ Alt+, F1aby przełączyć na TTY1. Zostaniesz poproszony o zalogowanie się, więc wpisz swoją nazwę użytkownika i hasło. Następnie uruchom polecenie, aby rozmrozić aplikację w taki sam sposób, jak uruchamiałbyś ją przez normalny emulator terminala. Po tym przełącz się z powrotem na pulpit (TTY7) za pomocą Ctrl+ Alt+ F7i powinieneś być w porządku.

Bajt Dowódca
źródło
4
Odkąd zacząłeś pgrep, mógłbyś kontynuowaćpkill
muru 17.04.16
1
Chociaż SIGSTOPistnieje ryzyko awarii aplikacji , powiedziałbym, że jest niewielkie. Często używałem go na Chromium i nie przypominam sobie, aby kiedykolwiek był przyczyną awarii.
kasperd 17.04.16
Nauczyłem się smtg nowość! killall! ;-)
Fabby 19.04.16
8

Aby zawiesić, spróbuj: killall -SIGTSTP chromium-browser

Jeśli to nie zadziała, spróbuj wersję stanowcze: killall -SIGSTOP chromium-browser.

Tak czy inaczej, aby kontynuować korzystanie killall -SIGCONT chromium-browser. Próbowałem z Firefoksem i działało. Pamiętaj jednak, że jeśli klikniesz przyciski w Chromium, gdy jest ono zawieszone, wykona te czynności, gdy będziesz kontynuować.

miasto zegarowe
źródło
3
SIGSTOP / SIGCONT działa dla mnie, wystarczy wpisać chromium-browserjako nazwę procesu. +1
GreggD
1
Lub google-chromejeśli używasz Google Chrome, ponieważ różnica jest najwyraźniej myląca
kot
2

Możesz wypróbować następujące opcje (w terminalu):

ps aux | grep gedit

Wtedy zobaczysz coś takiego:

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

Zapisz liczbę 7166 (lub dowolną inną), a następnie:

kill -STOP 7166

Spowoduje to zawieszenie wykonania procesu. Nie od razu zwolni używaną przez nią pamięć, ale pamięć będzie dostępna dla innych procesów, jeśli będą jej potrzebować.

Więc zrób

kill -CONT 7166 ponownie pracować z programem.

Pamiętaj, że musisz zmienić 7166 w razie potrzeby.

grooveplex
źródło