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.
Odpowiedzi:
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:
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.
źródło
Jakiś czas temu warto znaleźć tę procedurę na forum w Manjaro:
}
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.
źródło
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
źródło