Изящное завершение работы в ArchLinux

21

Я пытаюсь получить корректное завершение работы / перезагрузку в ArchLinux с GNOME Shell. Теперь, когда я запрашиваю завершение работы, он немедленно выключается, не давая времени открытым программам корректно закрыть / сохранить открытые файлы. В результате, всякий раз, когда я перезагружаю Chrome (например), он говорит мне, что сессия была закрыта неправильно и т. Д. Читая в Интернете, я узнал, что systemd при закрытии процессов сначала отправляет, а SIGTERMзатем, SIGKILLесли процесс не закрывается в течение определенного времени ожидания. Однако я замечаю, что в моей системе SIGKILLотправляется сразу после, SIGTERMи я думаю, что это является причиной незавершенного завершения программ.

Я нашел некоторую документацию, в которой (если я правильно прочитал) говорится, что время ожидания перед отправкой SIGKILLможет быть установлено TimeoutStopSec=опцией. Также отправка SIGKILLтакже может быть отключена по SendSIGKILL=желанию. Но я не могу найти, где настроить эти параметры ... Есть ли файл конфигурации systemd shutdown / reboot, где я могу установить эти параметры?

РЕДАКТИРОВАТЬ:

Я провел некоторое тестирование и обнаружил две интересные вещи:

  1. Если я вручную закрою Chrome, как это killall -SIGTERM chrome, он не будет жаловаться, что он не был закрыт правильно при следующем запуске. Если я вместо этого закрою killall -SIGKILL chromeего, он будет жаловаться. Это говорит мне о том, что Chrome правильно обрабатывает SIGTERM.
  2. Глядя на вывод моей процедуры выключения, systemd печатает Sending SIGTERM...сразу послеSending SIGKILL...

Согласно комментарию ниже, systemd обрабатывает только свои процессы. Так что в моем случае GDM. Это говорит мне, что проблема может быть:

  1. либо GDM не закрывает свои дочерние процессы (например, Chrome) правильно (т. е. отправляя им SIGTERM)
  2. или systemd отправляет GDM сообщение SIGKILL на ранний срок, не давая ему времени для правильного закрытия дочерних элементов.

Есть ли способ проверить / настроить, как на самом деле GDM закрывает своих детей?

lviggiani
источник
1
Systemd только сигнализирует процессы непосредственно под его контролем. Такие вещи, как хром, не являются одним из тех процессов. Systemd сообщит вашему дисплею диспетчера (xdm, gdm, kdm и т. Д.), Затем менеджер диспетчера будет сигнализировать его дочерним элементам и так далее, пока вы не перейдете в chrome. Если ничего не сигнализирует о chrome, он умирает, когда сервер xorg выключен, и его отображение исчезает.
Патрик
@ Патрик: спасибо, я догадался. Вот почему я попытался добавить 'TimeoutStopSec = 90s' в раздел '[Service]' в /etc/systemd/system/display-manager.service в соответствии с этим: freedesktop.org/software/systemd/man/systemd.service. HTML, но ничего не меняется ... :(
lviggiani
Chrome должен быть под systemd'sконтролем - systemdесть pid 1- но Chrome исполняет сценарий-оболочку в подоболочке и впоследствии вызывает дочерние процессы. Тем не менее, он будет делать то, что ему нужно, чтобы убить его, zygotesпока ваша система правильно настроена. Используете ли вы одно из тех временных решений для Chrome, которое вы найдете рекомендуемым в вики Arch?
mikeserv
1
Я столкнулся с аналогичной проблемой с KDE и Firefox на Arch. Я никогда не удосужился попытаться понять, почему.
StrongBad
2
GDM не сигнализирует о процессах. GDM - по сути глупый способ соединить Xorg и PAM. настоящий преступник gnome-session.
Стружец

Ответы:

2

Чтобы корректно завершить работу вашего рабочего стола, вам может потребоваться повысить значение TimeoutStopSec=для GDM или любого другого диспетчера дисплеев, который вы используете.

CameronNemo
источник
Мне кажется, что GDM никогда не должен был указывать systemd завершать работу, если он не знал, все ли клиенты могут быть закрыты.
загадочный
2

Это сработало для меня на моем Arch Linux с Gnome 3.12. Оказалось, что это может быть связано с конфигом в /etc/gdm/PostSession/Default.

  1. Запустите sudo pacman -S wmctrlдля установки wmctrl для управления окнами.

  2. Создайте исполняемый файл для закрытия всех окон. Например, я вставил это /home/[your_username]/bin/close-all-windowsс этим содержанием:

    #!/bin/sh
    wmctrl -l | while read -r line
    do
        wmctrl -c `echo "$line" | sed 's/.*  [0-9]* [your_hostname] //'`
    done
    
  3. Измените /etc/gdm/PostSession/Defaultи добавьте это содержимое до exit 0:

    echo " Closing selected windows programs gracefully"
    export DISPLAY=:0
    su [your_username] -c /home/[your_username]/bin/close-all-windows
    

Надеюсь, это сработает.

sorpaas
источник
Для Plasma 5 размещение этого сценария в .config / plasma-workspace / shutdown / решает проблему
AF7
-1

У меня хорошо работает скрипт sorpass wmctrl (в CentOS 7 мне просто нужно было сначала запустить yum install wmctrl). Однако я обнаружил, что / etc / gdm / PostSession / Default кажется, что он работает только при выходе из системы, а не при завершении работы. Поэтому вместо использования / etc / gdm / PostSession / Default теперь я вызываю скрипт sorpass wmctrl из скрипта Симона Фелана, который можно найти на этих двух сайтах:

Эта комбинация скриптов отлично подходит для автоматического и чистого закрытия Firefox, Chrome и т. Д., Когда я выхожу из системы или выключаю настольный компьютер CentOS 7. Обратите внимание, что для CentOS 7 вы должны запустить 'yum install gnome-python2-gnome', чтобы этот скрипт Python работал.

Джим
источник