Ubuntu kapanırken SIGTERM göndermiyor


21

Ubuntu'nun çalışan uygulamalara doğru şekilde çıkmalarını sağlamak için kapattıklarını söylemediğinden, bunun yerine bırakmalarını zorladığından şüphelenmeye başlıyorum.

Kapanırken kromu açık bırakırsam, açılıştan sonra tekrar açtığımda en son kapattığımı söylüyor, LibreOffice bana belgemi kaydetmek isteyip istemediğimi sormuyor ve bazı kodlar çalışması gereken bir uygulama yapıyorum Çıkışta, ancak bilgisayar kapatıldığında bunu yapmasına izin verilmez.

Anladığım kadarıyla, SIGTERM ilk önce tüm işlemlere temiz bir şekilde çıkmalarını sağlamak için gönderilir ve eğer çıkmazlarsa SIGKILL'i bırakmaları için gönderilir. Görünüşe göre Ubuntu ya SIGTERM'i göndermiyor ya da SIGKILL'i göndermeden önce uygulamaları yeterli zaman vermiyor.

Bunu düzeltebileceğim bir yol var mı?

Ubuntu 16.04 kullanıyorum, ancak sorun 15.10'da da mevcuttu. Ubuntu'yu kullanmaya başladığımdan beri 15.10'un en yeni sürüm olduğu zamanlar orada olup olmadığını söyleyemem.

Düzenleme: Birlik kullanıyorum ve bilgisayarımı kapatıyorum; sağ üst köşedeki donanıma basarak ve kapatmayı seçerek, ancak sudo haltterminalde çalışırken sorun aynı .

Düzenleme: Sadece oturumu kapatırken aynı davranışı gözlemliyorum. Tahminim, sinyalin çıkışta gönderilmesi gerektiği ve bu nedenle sorunun kapanması ve çıkışta ortaya çıkması gerektiğidir.


Nasıl kapatılıyor?
terdon

1
Chromium ve LibreOffice, SIGTERM'i istediğiniz şekilde işlemez
Andrea Corbellini

2
Ne demek istediğini anladığımdan emin değilim. SIGTERM'i doğru kullanmadıklarını mı kastediyorsunuz? Belki de yapmazlar ama benim soruma yazdığım gibi SIGTERM'i idare eden bir program üzerinde çalışıyorum ama bu kod hiç çalıştırılmamış gibi görünüyor. Ctrl + C tuşlarına basarken SIGINT mükemmel çalışır. Ubuntu'nun kapanmakta olan işlemlerin bildirilmesi konusunda bir sorun olduğuna hala inanıyorum.
GKraft


2
Tüm uygulamaları manuel olarak kapatmak zorunda kalmak can sıkıcıdır, ya da küçültülmüş bir uygulamayı unutursanız ne olur? İşini kurtarmayacak. Ve kolay kontrol edemediğiniz veya düşünemediğiniz birçok arka plan işlemi var. Onlara sonra temizlik yapma veya yaptıklarını kurtarma şansı tanınmayacak.
GKraft

Yanıtlar:


3

Ne yazık ki, bu şekilde pek işe yaramaz. Gerçekte bir sinyal işleyicisi olan bu programların çoğu, onay iletişim kutusu göstermesi için sinyali engellemez. Sinyal kullanımı genellikle az veya eksik.

Kapatmak zorunda kalmadan kolayca deneyebilirsiniz. SIGTERM'i çalışan Firefox veya LibreOffice işleminize gönderin:

$ pkill firefox

Normalde, Firefox gerçekten kapatmak isteyip istemediğinizi sorabilir. Ayrıca, özellikle uzun süredir çalıştığında ve 1 GB RAM'den fazla kullanıldığında, genellikle kapanması biraz zaman alıyor - işlemin son penceresi kapatıldıktan sonra sonlandırılması bir dakika kadar sürüyor. Bunların hiçbiri SIGTERM'i gönderdiğinizde gerçekleşmez, işlem anında sonlandırılır.

Ancak, bazı masaüstü ortamları kapatmadan önce tüm açık pencereleri kapatır. SIGTERM'den farklı olarak, bir pencereyi programlı olarak kapatmak, o pencerenin X düğmesine tıklamak veya Alt+ düğmesine benzer F4. Bu, diğer cevaptaki betiğin de yaptığı şeydir - tüm açık pencereleri zarafetle kapatmak için wmctrl kullanır.

Bir pencere kapatıldığında, program acele etmez ve o penceredeki her şeyi kapatabilir, örneğin açık sekmeler ve ayrıca kaydedilmemiş işler varsa bir iletişim penceresi de gösterebilir. Bir uygulamanın tüm açık pencereleri kapatıldıktan sonra, işlem genellikle kısa bir süre sonra sona erer.

Bu yüzden masaüstü ortamınıza bağlıdır (masaüstü ortamınızı kapatmak ve kullanmak için kullandığınızı varsayarak sudo poweroff). Örneğin, KDE, MATE'in açmazken kapatmadan önce açık pencerelerin kapatılmasını beklemelidir.

Alt satır: Tüm pencereleri kapatmadan önce manuel olarak kapatın. Veya tüm pencerelerin kapanmasını bekleyen bir masaüstü ortamı kullanın.


Kapatma işlemini görüyorum ve sinyal işleme tam düşündüğüm gibi çalışmadı. Şimdi nasıl çalışması gerektiğini ve neden beklediğim gibi çalışmadığını anladım.
GKraft

0

Ne pahasına olursa olsun, bir süre önce bu prosedürü Manjaro forumunda buldum:

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

}

Kapatma (veya yeniden başlatma) öncesinde tüm açık uygulamaları kapatmak için kendi komut dosyasında arayabilirsiniz.

Tek sorun şu ki, Xfce için yaratıldı, bu yüzden Unity DE'nin dayattığı değişikliklere ihtiyacı var. Daha bilgili birinden biraz yardım almak, OP sorununu çözmek için güzel bir şekilde buraya gelir.


Bilgisayarıma birkaç gün erişemeyeceğim, bu yüzden düzeltilmiş olsa bile deneyemem. Böyle bir betiği kullanmak gerçekten gerekli olmalı mı? Sanırım Ubuntu başa çıkabildi.
GKraft

Kabul. Yine de Xubuntu'da mükemmel çalışıyor. Örneğin, kaydedilmemiş bir belge varsa kapatma işlemi süresiz olarak bekler.
SR,

0

Aslında, tüm pencereleri kapatan ve herhangi bir DE'ye bağlı olmayan betiğin bir kısmı Ask'ta mevcuttur. 2. ve 3. cevaplar özellikle kullanışlıdır. Yalnızca birkaç satırla ve panelde veya masaüstünde başlatıcı oluşturarak, kullandığınız DE'de çalışan zarif bir kapatma elde edebilirsiniz.

Tüm açık pencereler incelikle nasıl kapatılır


Umut verici görünüyorlar. Muhtemelen benzer bir komut dosyası kullanarak sona erecek.
GKraft
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.