Ubuntu nie wysyła SIGTERM przy zamykaniu

21

Zaczynam podejrzewać, że Ubuntu nie mówi działającym aplikacjom, że zamyka się, aby pozwolić im wyjść poprawnie, ale zamiast tego zmusza je do wyjścia.

Jeśli pozostawiam chrome otwartego podczas zamykania, to mówi, że nie zamknął się poprawnie ostatnim razem, gdy otwieram go ponownie po uruchomieniu, LibreOffice nie pyta mnie, czy chcę zapisać dokument i tworzę aplikację, która musi uruchomić jakiś kod przy wyjściu, ale nie wolno tego robić, gdy komputer jest wyłączony.

Jak rozumiem, SIGTERM jest najpierw wysyłany do wszystkich procesów, aby umożliwić im czyste wyjście, a jeśli nie wyjdą, SIGKILL jest wysyłany w celu zmuszenia ich do wyjścia. Wygląda na to, że Ubuntu albo wcale nie wysyła SIGTERM, albo nie daje aplikacjom wystarczająco dużo czasu przed wysłaniem SIGKILL.

Czy jest jakiś sposób, aby to naprawić?

Korzystam z systemu Ubuntu 16.04, ale problem istniał również w wersji 15.10. Nie wiem, czy już tam był, odkąd zacząłem używać Ubuntu, kiedy 15.10 było najnowszą wersją.

Edycja: korzystam z Unity i wyłączam komputer, naciskając koło zębate w prawym górnym rogu i wybierając zamknij, chociaż problem jest taki sam, jeśli uruchomiony sudo halt w terminalu.

Edycja: Obserwuję to samo zachowanie podczas wylogowywania. Domyślam się, że sygnał powinien zostać wysłany przy wylogowaniu, a zatem problem pojawia się przy wyłączaniu i wylogowywaniu.

GKraft
źródło
Jak się zamykacie?
terdon
1
Chromium i LibreOffice nie obsługują SIGTERM w sposób, w jaki chcesz, aby był obsługiwany
Andrea Corbellini,
2
Nie jestem pewien, czy rozumiem, co masz na myśli. Czy masz na myśli, że nie obsługują poprawnie SIGTERM? Może nie, ale jak napisałem w swoim pytaniu, pracuję nad programem, który obsługuje SIGTERM, ale ten kod nigdy nie jest uruchamiany. SIGINT podczas naciskania klawiszy Ctrl + C działa idealnie. Nadal uważam, że jest problem z powiadomieniem Ubuntu o uruchamianiu procesów przy zamykaniu.
GKraft
1
Być może związane z tym błędem: # 1448259 Systemd nie wysyła najpierw SIGTERM po zamknięciu ?
JonasCz - Przywróć Monikę
2
Denerwujące jest ręczne zamykanie wszystkich aplikacji, a co jeśli zapomnisz o zminimalizowanej? Nie uratuje twojej pracy. Istnieje wiele procesów w tle, których nie można łatwo kontrolować lub o których nie myślisz. Nie będą mieli szansy posprzątać po sobie ani uratować tego, co robili.
GKraft

Odpowiedzi:

3

Niestety nie działa to w ten sposób. Wiele z tych programów, które faktycznie mają moduł obsługi sygnału, nie blokuje sygnału, aby wyświetlić okno dialogowe potwierdzenia. Obsługa sygnału jest często minimalna lub jej brak.

Możesz łatwo wypróbować go bez konieczności wyłączania. Wystarczy wysłać SIGTERM do uruchomionego procesu Firefox lub LibreOffice:

$ pkill firefox

Zwykle Firefox może zapytać, czy naprawdę chcesz go zamknąć. Ponadto zamknięcie zwykle zajmuje trochę czasu, zwłaszcza gdy działa ono przez dłuższy czas i zużywa więcej niż 1 GB pamięci RAM - zakończenie procesu po zamknięciu ostatniego okna zajmuje zwykle minutę. Nic takiego się nie dzieje, gdy wysyłasz SIGTERM, proces zostaje natychmiast zakończony.

Jednak niektóre środowiska pulpitu zamykają wszystkie otwarte okna przed wyłączeniem. W przeciwieństwie do SIGTERM, programowe zamknięcie okna przypomina kliknięcie przycisku X tego okna lub Alt+ F4. To samo robi skrypt w drugiej odpowiedzi - używa wmctrl do wdzięcznego zamykania wszystkich otwartych okien.

Gdy okno jest zamknięte, program nie śpieszy się i może zamknąć wszystko w tym oknie, na przykład otwarte karty, a także może wyświetlić okno dialogowe, jeśli jest niezapisana praca. Po zamknięciu wszystkich otwartych okien aplikacji proces zwykle kończy się wkrótce potem.

To zależy od środowiska pulpitu (zakładając, że używasz środowiska pulpitu do zamykania systemu, a nie sudo poweroff). Na przykład KDE powinno czekać na zamknięcie otwartych okien przed zamknięciem, podczas gdy MATE tego nie robi.

Konkluzja: Zamknij wszystkie otwarte okna ręcznie przed wyłączeniem. Lub użyj środowiska pulpitu, które czeka na zamknięcie wszystkich okien.

c0xc
źródło
Widzę, że proces zamykania i obsługa sygnałów nie działały dokładnie tak, jak myślałem. Teraz rozumiem, jak powinien działać i dlaczego nie działał zgodnie z oczekiwaniami.
GKraft,
0

Jakiś czas temu warto znaleźć tę procedurę na forum w Manjaro:

close_apps () {
WIN_IDs=$(wmctrl -l | grep -vwE "Desktop$|xfce4-panel$" | cut -f1 -d' ')
for i in $WIN_IDs; do wmctrl -ic "$i"; done

# Keep checking and waiting until all windows are closed
while [ "$WIN_IDs" != "" ]; do
        sleep 0.1;
        WIN_IDs=$(wmctrl -l | grep -vwE "Desktop$|xfce4-panel$" | cut -f1 -d' ')
done

}

Możesz to nazwać własnym skryptem, aby zamknąć wszystkie otwarte aplikacje przed zamknięciem (lub ponownym uruchomieniem).

Jedynym problemem jest to, że został stworzony dla Xfce, więc potrzebuje zmian, które narzuca Unity DE. Przydałaby się odrobina pomocy kogoś bardziej kompetentnego, aby pomóc rozwiązać problem OP.

SR
źródło
Nie będę mieć dostępu do mojego komputera przez kilka dni, więc nie mogę go wypróbować, nawet jeśli jest poprawiony. Czy naprawdę konieczne jest użycie takiego skryptu? Myślę, że Ubuntu sam sobie z tym poradzi.
GKraft
Zgoda. Jednak działa idealnie w Xubuntu. Na przykład zamknięcie będzie czekać w nieskończoność, jeśli istnieje niezapisany dokument.
SR
0

W rzeczywistości część skryptu, która zamyka wszystkie okna i nie zależy od konkretnego DE, jest dostępna w Ask. Odpowiedzi na pytania drugie i trzecie są szczególnie przydatne. Mając zaledwie kilka wierszy więcej, i tworząc program uruchamiający w panelu lub na pulpicie, możesz uzyskać doskonałe zamknięcie, które działa w używanym języku DE.

Jak z wdziękiem zamknąć wszystkie otwarte okna

SR
źródło
Wydają się obiecujące. Prawdopodobnie skończę przy użyciu podobnego skryptu.
GKraft