Витончене відключення в ArchLinux


21

Я намагаюся отримати витончене відключення / перезавантаження в ArchLinux з GNOME Shell. Тепер, коли я прошу закрити, він негайно вимикається, не даючи часу відкритим програмам граціозно закривати / зберігати відкриті файли. В результаті, коли я перезапустити Chrome (наприклад) він говорить мені , що сесія не була закрита правильно і т.д. Читаючи в Інтернеті я дізнався , що в той час як Systemd вимикаючи процеси, це перший відправити SIGTERMслід , SIGKILLякщо процес не закривається витримавши заданий тайм-аут. Однак я помічаю, що в моїй системі SIGKILLнадсилається одразу після того, SIGTERMі я гадаю, що це причина припинення не витончених програм.

Я знайшов деяку документацію, яка (якщо я її правильно прочитала) зазначає, що час очікування перед відправленням SIGKILLможе бути встановлений TimeoutStopSec=опцією. Також відправлення SIGKILLтакож може бути відключено за допомогою SendSIGKILL=опції. Але я не можу знайти, де налаштувати ці параметри ... чи є файл конфігураційних систем відключення / перезавантаження, де я можу встановити ці параметри?

Редагувати:

Я зробив кілька тестів і виявив дві цікаві речі:

  1. Якщо я вручну закрию такий хром killall -SIGTERM chrome, він не поскаржиться, що не був закритий правильно наступного разу, коли я його запускаю ще раз. Якщо я замість цього закрию killall -SIGKILL chrome, він поскаржиться. Це говорить мені, що хром правильно поводиться з системою SIGTERM.
  2. Дивлячись на результат моєї процедури відключення, системні відбитки Sending SIGTERM...одразу після цьогоSending SIGKILL...

Відповідно до коментаря нижче, systemd обробляє лише свої процеси. Так у моєму випадку GDM. Це говорить мені, що проблемою може бути:

  1. або GDM не закриває належних дочірніх процесів (наприклад, Chrome) (тобто, надсилаючи їм SIGTERM)
  2. або systemd надсилає GDM повідомлення SIGKILL рано, не даючи йому часу правильно закрити своїх дітей.

Чи є спосіб перевірити / налаштувати, як насправді GDM закриває своїх дітей?


1
Система сигналізує лише про процеси безпосередньо під її контролем. Такі речі, як хром, не є одним із таких процесів. Systemd подасть сигнал вашому менеджеру дисплеїв (xdm, gdm, kdm, що завгодно), тоді менеджер дисплеїв повинен передавати сигнал своїм дітям тощо, поки ви не перейдете на хром. Якщо нічого не сигналізує про хром, воно вмирає, коли сервер xorg вимикається і його дисплей згасає.
Патрік

@Patrick: спасибі, я так здогадався. Ось чому я спробував додати "TimeoutStopSec = 90s" до розділу "[Служба]" розділу "/etc/systemd/system/display-manager.service" відповідно до цього: freedesktop.org/software/systemd/man/systemd.service. html, але нічого не змінюється ... :(
lviggiani

Chrome має бути під systemd'sконтролем - systemdє pid 1- але Chrome виконує зі свого сценарію обгортки в нижній частині корпусу і після цього викликає дочірні процеси. І все-таки вона зробить все, що потрібно, щоб убити її до zygotesтих пір, поки ваша система буде правильно налаштована. Чи використовуєте ви одне з тих тимчасово-просторових рішень для хромування, які ви знайдете рекомендованими у вікі Arch?
mikeserv

1
Я зіткнувся з подібною проблемою з KDE та Firefox в Arch. Я ніколи не стикався, намагаючись зрозуміти, чому.
StrongBad

2
GDM не є процесами сигналізації. GDM - це по суті тупий спосіб підключення Xorg та PAM. справжній винуватець gnome-session.
strugee

Відповіді:


2

Щоб витончено вимкнути робочий стіл, вам може знадобитися підняти TimeoutStopSec=GDM або будь-який інший менеджер дисплеїв, який ви використовуєте.


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

2

Це працювало для мене на моєму Arch Linux із Gnome 3.12. Виявилося, що це, можливо, стосується конфігурації в /etc/gdm/PostSession/Default.

  1. Запустіть, sudo pacman -S wmctrlщоб встановити wmctrl для управління Windows.

  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
    

Сподіваюся, це спрацює.


Для плазми 5 розміщення цього сценарію в .config / плазмі робочої області / відключенні / вирішує проблему
AF7

-1

Скрипт wmctrl sorpass для мене добре працює (у CentOS 7 мені довелося спочатку запустити "yum install wmctrl"). Однак я виявив, що / etc / gdm / PostSession / Default, здається, працює лише під час виходу, а не відключення. Тому замість використання / etc / gdm / PostSession / Default я тепер називаю скрипт wmctrl sorpass з піт-скрипту Seamus Phelan, який можна знайти на цих двох сайтах:

Ця комбінація сценаріїв чудово підходить для автоматичного та чистого закриття Firefox, Chrome тощо, коли я виходжу з системи або вимикаю свій настільний апарат CentOS 7. Зауважте, що для CentOS 7 ви повинні запустити "yum install gnome-python2-gnome", щоб цей сценарій python працював.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.