Ubuntu tidak mengirim SIGTERM saat shutdown

21

Saya mulai curiga bahwa Ubuntu tidak memberi tahu aplikasi yang sedang berjalan bahwa ia dimatikan untuk membiarkannya keluar dengan benar tetapi sebaliknya memaksa mereka untuk berhenti.

Jika saya membiarkan chrome terbuka ketika mematikannya mengatakan bahwa itu tidak menutup dengan benar terakhir kali ketika saya membukanya lagi setelah boot, LibreOffice tidak bertanya apakah saya ingin menyimpan dokumen saya dan saya membuat aplikasi yang perlu menjalankan beberapa kode saat keluar tetapi tidak diizinkan untuk melakukannya saat komputer dimatikan.

Seperti yang saya pahami, SIGTERM pertama-tama dikirim ke semua proses untuk memungkinkan mereka keluar dengan bersih dan jika mereka tidak keluar, SIGKILL dikirim untuk memaksa mereka keluar. Tampaknya Ubuntu tidak mengirim SIGTERM sama sekali atau tidak memberikan aplikasi cukup waktu sebelum mengirim SIGKILL.

Apakah ada cara saya bisa memperbaikinya?

Saya menjalankan Ubuntu 16.04 tetapi masalahnya ada di 15.10 juga. Saya tidak tahu apakah itu ada di sana sejak saya mulai menggunakan Ubuntu ketika 15.10 adalah versi terbaru.

Sunting: Saya menggunakan Unity dan mematikan komputer saya dengan menekan roda gigi di sudut kanan atas dan memilih mematikan, meskipun masalahnya sama jika berjalan sudo haltdi terminal.

Sunting: Saya mengamati perilaku yang sama ketika hanya keluar. Dugaan saya adalah bahwa sinyal seharusnya dikirim pada saat logout dan karena itu masalah timbul pada shutdown dan log out.

GKraft
sumber
Bagaimana Anda mematikannya?
terdon
1
Chromium dan LibreOffice tidak menangani SIGTERM seperti yang Anda inginkan
Andrea Corbellini
2
Saya tidak yakin saya mengerti maksud Anda. Apakah maksud Anda bahwa mereka tidak menangani SIGTERM dengan benar? Mungkin mereka tidak tetapi ketika saya menulis dalam pertanyaan saya, saya sedang mengerjakan sebuah program yang menangani SIGTERM tetapi kode itu sepertinya tidak pernah dijalankan. SIGINT sambil menekan ctrl + C bekerja dengan sempurna. Saya masih percaya bahwa ada beberapa masalah tentang Ubuntu yang memberitahukan proses yang sedang berjalan saat dimatikan.
GKraft
2
Menjengkelkan karena harus menutup semua aplikasi secara manual, dan bagaimana jika Anda melupakan yang diminimalkan? Itu tidak akan menyelamatkan pekerjaan Anda. Dan ada banyak proses latar belakang yang tidak bisa Anda kontrol dengan mudah atau tidak dipikirkan. Mereka tidak akan diberi kesempatan untuk membersihkan diri mereka sendiri atau menyelamatkan apa pun yang mereka lakukan.
GKraft

Jawaban:

3

Sayangnya, cara ini tidak cukup. Banyak dari program-program yang benar-benar memiliki pengendali sinyal, tidak memblokir sinyal untuk menampilkan dialog konfirmasi. Penanganan sinyal seringkali minimal atau hilang.

Anda dapat dengan mudah mencobanya tanpa harus mematikan. Cukup kirim SIGTERM ke proses Firefox atau LibreOffice Anda yang sedang berjalan:

$ pkill firefox

Biasanya, Firefox mungkin bertanya apakah Anda benar-benar ingin menutupnya. Selain itu, biasanya perlu beberapa saat untuk menutup, terutama ketika itu sudah berjalan untuk waktu yang lama dan menggunakan lebih dari 1 GB RAM - sering membutuhkan waktu satu menit untuk proses untuk mengakhiri setelah jendela terakhir telah ditutup. Tak satu pun dari ini terjadi ketika Anda mengirim SIGTERM, proses dihentikan begitu saja secara instan.

Namun, beberapa lingkungan desktop menutup semua jendela yang terbuka sebelum dimatikan. Tidak seperti SIGTERM, menutup jendela secara terprogram seperti mengeklik tombol X pada jendela itu, atau Alt+ F4. Ini juga yang dilakukan script pada jawaban lain - ia menggunakan wmctrl untuk menutup semua jendela yang terbuka dengan anggun.

Ketika jendela ditutup, program tidak terburu-buru dan dapat menutup segala sesuatu di dalam jendela itu, misalnya tab terbuka, dan itu juga dapat menampilkan jendela dialog jika ada pekerjaan yang belum disimpan. Setelah semua jendela aplikasi dibuka, proses biasanya berakhir tidak lama setelah itu.

Jadi itu tergantung pada lingkungan desktop Anda (dengan asumsi Anda menggunakan lingkungan desktop Anda untuk mematikan dan tidak sudo poweroff). Sebagai contoh, KDE harus menunggu jendela terbuka ditutup sebelum dimatikan, sedangkan MATE tidak.

Intinya: Tutup semua jendela yang terbuka secara manual sebelum mematikan. Atau gunakan lingkungan desktop yang menunggu semua jendela ditutup.

c0xc
sumber
Saya melihat proses penutupan dan penanganan sinyal tidak bekerja persis seperti yang saya kira. Sekarang saya mengerti bagaimana itu seharusnya bekerja dan mengapa itu tidak berfungsi seperti yang saya harapkan.
GKraft
0

Untuk apa nilainya, beberapa waktu lalu, saya telah menemukan prosedur ini di forum Manjaro:

close_apps () {
WIN_IDs=$(wmctrl -l | grep -vwE "Desktop$|xfce4-panel$" | cut -f1 -d' ')
for i in $WIN_IDs; do wmctrl -ic "$i"; done

# Keep checking and waiting until all windows are closed
while [ "$WIN_IDs" != "" ]; do
        sleep 0.1;
        WIN_IDs=$(wmctrl -l | grep -vwE "Desktop$|xfce4-panel$" | cut -f1 -d' ')
done

}

Anda dapat menyebutnya dalam skrip Anda sendiri untuk menutup semua aplikasi yang terbuka sebelum mematikan (atau memulai ulang).

Satu-satunya masalah adalah, ia dibuat untuk Xfce jadi, perlu perubahan yang diterapkan Unity DE. Sedikit bantuan dari seseorang yang lebih berpengetahuan akan datang dengan baik di sini untuk membantu menyelesaikan masalah OP.

SR
sumber
Saya tidak akan memiliki akses ke komputer saya selama beberapa hari jadi saya tidak bisa mencobanya walaupun sudah diperbaiki. Haruskah benar-benar diperlukan untuk menggunakan skrip seperti itu? Saya pikir ubuntu harus menanganinya dengan sendirinya.
GKraft
Sepakat. Ini berfungsi dengan baik di Xubuntu. Misalnya, shutdown akan menunggu tanpa batas waktu jika ada dokumen yang belum disimpan.
SR
0

Sebenarnya, bagian skrip yang menutup semua jendela dan tidak bergantung pada DE tertentu tersedia di Ask. Jawaban kedua dan ketiga sangat berguna. Dengan hanya beberapa baris lagi, dan dengan membuat peluncur di panel atau di desktop Anda dapat mencapai shutdown anggun yang bekerja di DE yang Anda gunakan.

Cara menutup semua jendela yang terbuka dengan anggun

SR
sumber
Mereka tampak menjanjikan. Saya mungkin akan berakhir menggunakan skrip yang sama.
GKraft