Apa yang terjadi ketika saya menekan "Shut Down" dari GUI?

15

Saya telah membenturkan kepala saya terhadap ini selama beberapa waktu sekarang. Ini terkait dengan pertanyaan ini . Saya ingin mencari tahu apa yang terjadi ketika saya memilih untuk mematikan kotak Linux saya dari GUI. Ini sepertinya tidak terdokumentasi dengan baik.

Idealnya, saya mengharapkan jawaban DE- dan OS-agnostik. Kecuali itu, saya tertarik pada kasus spesifik Mandriva 2010.1 dan Debian 6.x (Squeeze) dan 7.0 (Wheezy) semuanya menjalankan Gnome. (Jika Anda memperhatikan dengan seksama, ya itu Gnome 2 dan Gnome 3)

Pada dasarnya, saya ingin tahu perintah / skrip / urutan skrip yang dimulai ketika saya menekan "Shut Down" atau "Restart" sehingga saya dapat mengubah perilaku mereka. Beberapa posting forum yang saya lihat menyarankan peretasan/etc/polkit-1/* tetapi struktur direktori ini hanya kerangka pada kotak Debian (Squeeze) saya, misalnya.

Adakah yang bisa membantu?


EDIT

Apa yang saya coba sejauh ini

  • Mengganti shutdownexecutable dengan skrip saya sendiri. Ini tidak berfungsi: ketika saya menekan shutdownkeluar log Gnome tanpa menjalankan skrip saya.
  • Sudah mencoba mengedit menu Gnome 2. Tanpa sukacita: opsi "Shutdown", "Log out" dan "Lock Screen" tidak muncul di editor menu.
  • Dilihat /usr/share/menu, tidak ada yang membantu di sana.

Kemungkinan jalan keluar untuk solusi

  • straceing opsi GUI (apakah ini mungkin?)
  • Melihat ke shutdownkode sumber
  • Melihat gnome-sessionkode sumber

Memperbarui

Sesuai komentar saya pada jawaban di bawah ini, saya telah melihat polkittindakan di bawah /usr/share/polkit-1/actions/dan menemukan (dalam file org.freedesktop.consolekit.policy) tindakan yang disebut org.freedesktop.consolekit.system.stop-multiple-usersmelempar pesan

System policy prevents stopping the system when other users are logged in

Saya berpikir (karena org.freedesktop.*konvensi penamaan) bahwa ini adalah semacam sinyal yang dikirim ke DM melalui D-BUS. Selain itu, pesan ini muncul ketika mencoba untuk mematikan secara grafis ketika pengguna lain masuk, sehingga mekanisme yang memicu itu harus dipicu mekanisme yang sama ketika "Matikan" atau "Matikan" dipilih dari GUI.

Adakah yang bisa mengkonfirmasi / membantah? Apakah ada kemungkinan mencegat sinyal ini atau memodifikasinya?

Joseph R.
sumber
Apa yang ingin Anda capai? Anda mungkin dapat menambahkan suntingan /etc/init.d/rc.localuntuk memanggil skrip saat dihentikan .
depquid
@depquid Apa yang saya coba selesaikan adalah dalam pertanyaan lama saya yang saya tautkan ke: Saya mencoba untuk mencegah pengguna yang masuk secara lokal dari mengalahkan sesi SSH pengguna lain.
Joseph R.

Jawaban:

9

Itu tergantung pada Display Manager Anda! (yaitu KDM, GDM)

Harap diingat bahwa DM Anda berjalan sebagai root! (perlu root privilege untuk menjalankan proses sesi Anda sebagai pengguna yang Anda masuki)

Ketika Anda mengklik shutdown di KDE atau GNOME, DE Anda mengirimkan sinyal ke DM Anda untuk mematikan atau memulai kembali setelah sesi berakhir. Kemudian, DE Anda memberi tahu setiap program untuk mengakhiri dan setelah semua proses lainnya dihentikan (atau berakhir waktu habis), proses terakhir DE Anda - proses sesi - berakhir.

Proses sesi adalah proses pertama yang dimulai dalam sesi X11. Ketika terbunuh atau berakhir, sesi berakhir. Pernahkah Anda melihat xterm itu ketika menjalankan X tanpa DE? Itu adalah proses sesi. Proses ini disebut kdeinitdalam KDE dan gnome-sessiondi GNOME.

Setelah sesi diakhiri, kontrol dikembalikan ke DM Anda (yang telah menunggu proses X berakhir), dan memeriksa apa yang DE katakan kepadanya untuk dilakukan. Jika diperintahkan untuk mematikan atau memulai ulang, itu akan melakukannya. Dalam kasus lain, itu hanya akan memulai layar login baru di X.

Ini juga terkait dengan masalah yang mungkin Anda miliki di masa lalu, dengan beberapa DE tidak dapat mematikan atau memulai kembali, hanya untuk logout, ketika digunakan dalam kombinasi dengan beberapa DM lainnya.

Bagaimanapun, ini tidak begitu buruk didokumentasikan. GDM memiliki halaman manual dari sebuah perintah yang memungkinkan Anda untuk mengatakannya untuk mematikan seperti yang saya katakan sebelumnya ( gdm-control). KDM juga memiliki dokumentasi yang sangat baik dan memiliki utilitas yang mirip (sedikit lebih kompleks) kdmctl.


Shutdown dan restart dimungkinkan tanpa PolicyKit, tetapi PolicyKit melayani banyak keperluan yang dibutuhkan pada sistem saat ini seperti memasang disk tanpa menjadi root, menangguhkan atau hibernasi komputer. Dan keduanya tidak didokumentasikan dengan buruk!

Lihat ini jika Anda ingin tahu lebih banyak tentang apa itu PolicyKit dan bagaimana cara kerjanya: http://www.freedesktop.org/software/polkit/docs/latest/polkit.8.html

Alicia
sumber
Kedengarannya menjanjikan. Terima kasih atas tautan ke dokumen. Saya tidak ragu manual ini komprehensif dan jelas tetapi mungkin juga tidak ada. Jawaban Anda adalah pertama kalinya saya melihat manajer tampilan yang disebutkan sehubungan dengan masalah ini, jadi itu bukan pengetahuan umum. Saya akan mencoba ini dan memberi tahu Anda ...
Joseph R.
BAIK. gdm-controltidak membantu. Dokumentasi yang Anda berikan di PolicyKit tampaknya lebih menjanjikan. Saya akan menggali dan melihat apakah saya bisa menerapkan aturan khusus. Akan dilanjutkan ...
Joseph R.
1
Saya membaca (membaca sekilas, lebih suka) dan mohon perbaiki jika saya salah: DE, ketika diminta untuk mematikan, akan mengirim pesan ke DM melalui polkit pada D-BUS. Autentikasi yang tertunda, sesi dapat diakhiri atau permintaan dibatalkan. Ini didefinisikan dalam polkittindakan yang disebut org.freedesktop.consolekit.system.stop-multiple-usersdi /usr/share/polkit-1/actionsIni diatur untuk mencabut permintaan untuk pengguna yang tidak aktif dan auth_admin_keepuntuk pengguna aktif. Pertanyaannya adalah, apa yang mendefinisikan tindakan ini? Apa tepatnya yang dijalankannya?
Joseph R.
@don_crissti Sekarang saya mengerti. Yang saya tertarik justru adalah "sinyal" ini. Apa klien yang mengirimnya?
Joseph R.
@don_crissti Ingin memindahkan komentar ini ke pertanyaan saya yang lain untuk tindak lanjut?
Joseph R.