Shutdown anggun di ArchLinux

21

Saya mencoba mendapatkan shutdown / reboot yang anggun di ArchLinux dengan GNOME Shell. Sekarang, ketika saya meminta shut-down, itu segera dimatikan tanpa memberi waktu buka program untuk menutup / menyimpan file terbuka. Akibatnya, setiap kali saya memulai ulang Chrome (misalnya) itu memberi tahu saya bahwa sesi tidak ditutup dengan benar, dll. Dengan membaca di web saya mengetahui bahwa systemd saat mematikan proses, pertama-tama mengirim SIGTERMdiikuti oleh SIGKILLjika proses tidak menutup dalam batas waktu tertentu. Namun saya perhatikan bahwa pada sistem saya SIGKILLdikirim segera setelah SIGTERMdan saya kira ini adalah penyebab dari penghentian program tidak anggun.

Saya telah menemukan beberapa dokumentasi yang (jika saya membacanya dengan benar) menyatakan bahwa batas waktu sebelum pengiriman SIGKILLdapat diatur oleh TimeoutStopSec=opsi. Selain itu pengiriman SIGKILLjuga dapat dinonaktifkan dengan SendSIGKILL=opsi. Tetapi saya tidak dapat menemukan tempat untuk mengkonfigurasi opsi-opsi itu ... apakah ada file konfigurasi shutdown / reboot systemd di mana saya dapat mengatur opsi-opsi itu?

EDIT:

Saya melakukan beberapa tes dan saya menemukan dua hal menarik:

  1. Jika saya menutup krom secara manual seperti ini killall -SIGTERM chrome, tidak akan mengeluh bahwa belum ditutup dengan benar saat berikutnya saya memulai lagi. Jika saya menutupnya seperti ini sebagai gantinya killall -SIGKILL chrome, itu akan mengeluh. Ini memberitahu saya bahwa chrome menangani SIGTERM dengan benar.
  2. Melihat output prosedur shutdown saya, cetakan systemd Sending SIGTERM...segera diikuti olehSending SIGKILL...

Menurut komentar di bawah ini, systemd hanya menangani prosesnya saja. Jadi dalam kasus saya GDM. Ini memberitahu saya bahwa masalahnya mungkin:

  1. baik GDM tidak menutup proses turunannya (mis. Chrome) dengan benar (yaitu dengan mengirimkan SIGTERM kepada mereka)
  2. atau systemd mengirimkan pesan SIGKILL kepada GDM lebih awal tanpa memberinya waktu untuk menutup anak-anaknya dengan benar.

Apakah ada cara untuk memeriksa / mengkonfigurasi bagaimana sebenarnya GDM menutup anak-anaknya?

lviggiani
sumber
1
Systemd hanya memberi sinyal proses langsung di bawah kendali itu. Hal-hal seperti chrome bukan salah satu dari proses-proses itu. Systemd akan memberi sinyal manajer tampilan Anda (xdm, gdm, kdm, apa pun), kemudian terserah manajer tampilan untuk memberi sinyal kepada anak-anaknya, dan seterusnya di telepon sampai Anda mendapatkan chrome. Jika tidak ada sinyal chrome, ia mati ketika server xorg dimatikan dan tampilannya hilang.
Patrick
@ Patrick: terima kasih, saya rasa begitu. Itu sebabnya saya mencoba menambahkan 'TimeoutStopSec = 90s' ke '[Layanan]' bagian dari '/etc/systemd/system/display-manager.service' sesuai dengan ini: freedesktop.org/software/systemd/man/systemd.service. html tetapi tidak ada yang berubah ... :(
lviggiani
Chrome harus berada di bawah systemd'skontrol - systemdadalah pid 1- tetapi eksekutif Chrome dari skrip wrapper dalam sebuah proses subkulit dan memanggil anak sesudahnya. Namun, ia akan melakukan apa yang diperlukan untuk mematikannya zygotesselama sistem Anda dikonfigurasi dengan benar. Apakah Anda menggunakan salah satu solusi temp-space untuk chrome yang akan Anda rekomendasikan di Arch wiki?
mikeserv
1
Saya mengalami masalah serupa dengan KDE dan Firefox on Arch. Saya belum pernah mencoba untuk mencari tahu mengapa.
StrongBad
2
GDM bukan proses pensinyalan. GDM pada dasarnya adalah cara bodoh untuk menghubungkan Xorg dan PAM. penyebab sesungguhnya adalah gnome-session.
strugee

Jawaban:

2

Untuk mematikan desktop dengan anggun, Anda mungkin perlu menaikkan TimeoutStopSec=untuk GDM, atau manajer tampilan apa pun yang Anda gunakan.

CameronNemo
sumber
Menurut saya GDM seharusnya tidak pernah memberi tahu systemd untuk menutup sejak awal jika tidak tahu apakah semua klien dapat ditutup.
EnigmaticPhysicist
2

Ini bekerja untuk saya di Arch Linux saya dengan Gnome 3.12. Ternyata itu mungkin terkait dengan konfigurasi di /etc/gdm/PostSession/Default.

  1. Jalankan sudo pacman -S wmctrluntuk menginstal wmctrl untuk manajemen windows.

  2. Buat file yang dapat dieksekusi untuk menutup semua jendela. Misalnya, saya memasukkannya /home/[your_username]/bin/close-all-windowsdengan konten ini:

    #!/bin/sh
    wmctrl -l | while read -r line
    do
        wmctrl -c `echo "$line" | sed 's/.*  [0-9]* [your_hostname] //'`
    done
    
  3. Ubah /etc/gdm/PostSession/Defaultdan tambahkan konten ini sebelum exit 0:

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

Semoga ini berhasil.

sorpa
sumber
Untuk Plasma 5, letakkan skrip ini di .config / plasma-workspace / shutdown / memecahkan masalah
AF7
-1

script wmctrl sorpass bekerja dengan baik untuk saya (pada CentOS 7 saya baru saja menjalankan 'yum install wmctrl' terlebih dahulu). Namun saya menemukan bahwa / etc / gdm / PostSession / Default hanya berjalan pada saat logout, bukan shutdown. Oleh karena itu alih-alih menggunakan / etc / gdm / PostSession / Default Saya sekarang memanggil skrip wmctrl sorpass dari skrip python Seamus Phelan yang dapat ditemukan di dua situs ini:

Kombinasi skrip ini berfungsi baik untuk menutup Firefox, Chrome, dll. Secara otomatis dan bersih ketika saya logout atau mematikan mesin desktop CentOS 7 saya. Perhatikan bahwa dengan CentOS 7 Anda harus menjalankan 'yum install gnome-python2-gnome' agar skrip python ini berfungsi.

Jim
sumber