Я пытаюсь получить корректное завершение работы / перезагрузку в ArchLinux с GNOME Shell. Теперь, когда я запрашиваю завершение работы, он немедленно выключается, не давая времени открытым программам корректно закрыть / сохранить открытые файлы. В результате, всякий раз, когда я перезагружаю Chrome (например), он говорит мне, что сессия была закрыта неправильно и т. Д. Читая в Интернете, я узнал, что systemd при закрытии процессов сначала отправляет, а SIGTERM
затем, SIGKILL
если процесс не закрывается в течение определенного времени ожидания. Однако я замечаю, что в моей системе SIGKILL
отправляется сразу после, SIGTERM
и я думаю, что это является причиной незавершенного завершения программ.
Я нашел некоторую документацию, в которой (если я правильно прочитал) говорится, что время ожидания перед отправкой SIGKILL
может быть установлено TimeoutStopSec=
опцией. Также отправка SIGKILL
также может быть отключена по SendSIGKILL=
желанию. Но я не могу найти, где настроить эти параметры ... Есть ли файл конфигурации systemd shutdown / reboot, где я могу установить эти параметры?
РЕДАКТИРОВАТЬ:
Я провел некоторое тестирование и обнаружил две интересные вещи:
- Если я вручную закрою Chrome, как это
killall -SIGTERM chrome
, он не будет жаловаться, что он не был закрыт правильно при следующем запуске. Если я вместо этого закроюkillall -SIGKILL chrome
его, он будет жаловаться. Это говорит мне о том, что Chrome правильно обрабатывает SIGTERM. - Глядя на вывод моей процедуры выключения, systemd печатает
Sending SIGTERM...
сразу послеSending SIGKILL...
Согласно комментарию ниже, systemd обрабатывает только свои процессы. Так что в моем случае GDM. Это говорит мне, что проблема может быть:
- либо GDM не закрывает свои дочерние процессы (например, Chrome) правильно (т. е. отправляя им SIGTERM)
- или systemd отправляет GDM сообщение SIGKILL на ранний срок, не давая ему времени для правильного закрытия дочерних элементов.
Есть ли способ проверить / настроить, как на самом деле GDM закрывает своих детей?
источник
systemd's
контролем -systemd
естьpid 1
- но Chrome исполняет сценарий-оболочку в подоболочке и впоследствии вызывает дочерние процессы. Тем не менее, он будет делать то, что ему нужно, чтобы убить его,zygotes
пока ваша система правильно настроена. Используете ли вы одно из тех временных решений для Chrome, которое вы найдете рекомендуемым в вики Arch?gnome-session
.Ответы:
Чтобы корректно завершить работу вашего рабочего стола, вам может потребоваться повысить значение
TimeoutStopSec=
для GDM или любого другого диспетчера дисплеев, который вы используете.источник
Это сработало для меня на моем Arch Linux с Gnome 3.12. Оказалось, что это может быть связано с конфигом в
/etc/gdm/PostSession/Default
.Запустите
sudo pacman -S wmctrl
для установки wmctrl для управления окнами.Создайте исполняемый файл для закрытия всех окон. Например, я вставил это
/home/[your_username]/bin/close-all-windows
с этим содержанием:Измените
/etc/gdm/PostSession/Default
и добавьте это содержимое доexit 0
:Надеюсь, это сработает.
источник
У меня хорошо работает скрипт 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 работал.
источник