Bir uygulamadan düzgün şekilde çıkmadan bir terminal penceresini kapatmak zararlı mıdır?


18

Ubuntu 12.04 LTS kullanarak sorum şu: Terminal penceresinde bir uygulama başlattıysam, ilk önce uygulamadan çıkmadan sadece terminal penceresini kapatmakla ilgili kötü bir şey var. Örneğin, MATLAB kullanıyorum. Bir terminal açıyorum ve yazıyorum

matlab -nodisplay -nodesktop -nosplash

ve bir sürü komut dosyası çalıştırın. Sonra ben de yapabilirim

exit

MATLAB'ı sonlandırmak ve sonra terminal penceresini kapatmak veya sadece terminal penceresini kapatmak için. Bu iki yöntem arasındaki fark gerçekten nedir? İkinci yöntem bir şekilde bir şeye "zarar veriyor" mu? İlk yöntem tercih edilir mi? Neden?

Yanıtlar:


22

Genel olarak bu şekilde yapılması iyi olur.

Terminal penceresini kapatmak için "X" düğmesini tıklattığınızda, masaüstünüzden (GNOME, KDE, vb.) Terminal uygulamasına bir "sinyal" göndererek kendini kapatmasını söyler. MATLAB'ı bu kabukta çalıştırdığınız için, terminal uygulaması için bir alt süreç olarak kabul edilir.

Ebeveynlik süreci olmanın sorumluluklarının bir kısmı da, bu aynı "sinyali" çocuklarınıza göndermenizdir.

Şimdi neyi açıkladığımı kavramsal olarak anlarsanız, gerçek terminolojinin biraz daha yerini alalım.

sinyalleri

İlk olarak "sinyal" ile, aslında Unix işlemlerine gönderebileceğiniz farklı sinyallerden oluşan bir aile vardır . Basit tutmak için 4 genellikle görecekleri anlamına vardır SIGHUP, SIGTERM, SIGINT, ve SIGKILL.

  • SIGHUP

    SIGHUP sinyali kontrol terminali kapalı olduğunda bir işleme gönderilir. Başlangıçta bir seri hat düşüş sürecini bildirmek için tasarlanmıştır. Modern sistemlerde, bu sinyal genellikle sözde veya sanal terminalin kontrolünün kapatıldığı anlamına gelir.

  • SIGTERM

    SIGTERM sinyali, program sonlandırmasına neden olmak için kullanılan genel bir sinyaldir. SIGKILL'in aksine, bu sinyal engellenebilir, kullanılabilir ve yok sayılabilir. Bir programdan kibarca sona erdirilmesini istemenin normal yolu budur.

  • SIGINT

    Kullanıcı INTR karakterini (normalde Cc) yazdığında SIGINT (“program kesmesi”) sinyali gönderilir.

  • sigkill

    SIGKILL sinyali, programın derhal sonlandırılmasına neden olmak için kullanılır. İşlenemez veya göz ardı edilemez ve bu nedenle her zaman ölümcüldür. Bu sinyali engellemek de mümkün değildir.

NOT: SIGINT Çalışmanın ortasında iken bir programı komut satırından "kırmak" için Ctrl+ kullandığınızda gönderilen Cmesajdır.

hangisi kullanılıyor?

Büyük olasılıkla SIGTERMpencere ortamınız tarafından çağrılıyor ve terminalinize aktarılıyor. Terminaliniz büyük olasılıkla SIGHUPMATLAB'a gönderilir. Bu sinyal, tüm süreçlere herhangi bir yerel temizlik (dosyaları kapatma, bitirme işlemleri, vb.) Yapma fırsatı verir.

öldürme komutu

Kötü adlandırılmış komutu kullanarak kendiniz sinyal gönderebilirsiniz kill,. Yani göndermek için SIGTERMterminal veya sinyal SIGHUP to MATLAB, you could determine their PID usingps` ve sonra onları sinyal göndermek için bu komutu çalıştırın:

$ kill -SIGTERM <PID>

veya bu:

$ kill -SIGHUP <PID>

Bu komutu kullanarak sinyallerin tam bir listesini alabilirsiniz:

$ kill -l
 1) SIGHUP   2) SIGINT   3) SIGQUIT  4) SIGILL   5) SIGTRAP
 6) SIGABRT  7) SIGBUS   8) SIGFPE   9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
...
...

Sinyallerin sayı olduğuna dikkat edin? Sık sık isimleriyle değil, bu şekilde kullanıldığını görürsünüz:

$ kill -15 <PID>

Ya da -9hemen hemen her işlemi öldürebilen rezil .


Her zaman bu sayıların negatif olduğunu düşündüm, ama aslında komut satırı argümanları. Yeni bir şey öğrendim: D
Thomas

1
HUP - HangUP - bir terminal için "hattı kaybederseniz", örneğin bir Unix sunucusuna modem ile bağlandığınızda gönderilen sinyaldir. Muhtemelen bir süreci sonlandıran en "nazik" sinyaldir. Çoğu armağan çıkmaz, ancak yapılandırma dosyalarını HUP'ta yeniden okur. Nohup komutu kabuk kapatıldıktan sonra arka plan işleminin devam etmesine izin verir. Ekran gibi komutlar kapatmadan kurtulur ve içindeki komutları HUP'tan yalıtır.
Baard Kopperud

@BaardKopperud - teşekkürler, HUP'u kasten dışarıda bıraktım, tartışmayı karıştırmak istemedim.
slm

@BaardKopperud - Sanırım işaret ettiğin şudur: "SIGHUP sinyali kontrol terminali kapalıyken bir işleme gönderilir. Başlangıçta bir seri hat düşüş sürecini bildirmek için tasarlanmıştır. Modern sistemlerde, bu sinyal genellikle yalancı veya sanal terminalin kontrolünün kapatıldığı anlamına gelir. "Açıklamamda biraz yalan söyledim ama basit tutmaya çalıştığımı itiraf ediyorum.
slm

@BaardKopperud - Kendimi suçlu hissettim, bu yüzden cevabımı olup biteni daha doğru yansıtacak şekilde değiştirdim. Teşekkürler!
slm

2

Büyük olasılıkla sorun değil, hangi uygulamaları açtığınıza bağlı olarak veri kaybedeceksiniz. Örneğin, açık bir dosya düzenleyiciniz varsa, düzgün kaydetmez ve çıkmazsanız değişikliklerinizin bir kısmını kaybedebilirsiniz. Endişeniz varsa, terminalden çıkış / çıkış yapın. Yazmayı sevmiyorsanız exitveya logoutsadece deneyin Ctrl-D.


Neden daha iyi olsun ki? Uygulama SIGTERM yerine SIGHUP alacak, ama yine de bir sinyal tarafından öldürülüyor, bu yüzden tam olarak "düzgün bir şekilde kaydet ve çık"
demezdim

Bildiğim kadarıyla Ctrl-D, bu sadece komut isteminde geçerlidir.
Mark
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.