Apakah berbahaya menutup jendela terminal tanpa keluar dari aplikasi dengan benar?

18

Menggunakan Ubuntu 12,04 LTS, pertanyaan saya adalah bahwa jika saya memulai aplikasi di jendela terminal, maka apakah ada hal buruk tentang hanya menutup jendela terminal tanpa keluar dari aplikasi dengan benar terlebih dahulu. Sebagai contoh, saya menggunakan MATLAB. Saya membuka terminal dan mengetik

matlab -nodisplay -nodesktop -nosplash

dan kemudian jalankan banyak skrip. Maka saya juga bisa

exit

untuk mengakhiri MATLAB dan kemudian tutup jendela terminal atau tutup saja jendela terminal. Apa sebenarnya perbedaan antara kedua metode ini? Apakah metode kedua entah bagaimana "membahayakan" sesuatu? Apakah metode pertama lebih disukai? Mengapa?

Titik pasti
sumber

Jawaban:

22

Secara umum ini harus dilakukan dengan cara ini.

Ketika Anda mengklik "X" untuk menutup jendela terminal, yaitu mengirim "sinyal" dari desktop Anda (GNOME, KDE, dll.) Ke aplikasi terminal, memerintahkannya untuk mematikan dirinya sendiri. Karena Anda menjalankan MATLAB di shell ini dianggap proses anak ke aplikasi terminal.

Jadi bagian dari tanggung jawab menjadi proses orang tua, adalah Anda pada gilirannya mengirimkan "sinyal" yang sama ini kepada anak-anak Anda.

Sekarang jika Anda memahami secara konseptual apa yang baru saja saya jelaskan, mari kita gantikan terminologi yang sebenarnya.

sinyal

Pertama dengan "sinyal", sebenarnya ada seluruh keluarga sinyal berbeda yang dapat Anda kirim ke proses Unix. Untuk tetap sederhana ada 4 yang Anda sering akan melihat, SIGHUP, SIGTERM, SIGINT, dan SIGKILL.

  • PENJUALAN

    Sinyal SIGHUP dikirim ke proses ketika terminal pengendali ditutup. Awalnya dirancang untuk memberi tahu proses penurunan garis serial. Dalam sistem modern, sinyal ini biasanya berarti bahwa mengendalikan terminal semu atau virtual telah ditutup.

  • SIGTERM

    Sinyal SIGTERM adalah sinyal umum yang digunakan untuk menyebabkan penghentian program. Tidak seperti SIGKILL, sinyal ini dapat diblokir, ditangani, dan diabaikan. Ini adalah cara normal untuk dengan sopan meminta suatu program untuk berakhir.

  • SIGINT

    Sinyal SIGINT ("program interrupt") dikirim ketika pengguna mengetik karakter INTR (biasanya Cc).

  • SIGKILL

    Sinyal SIGKILL digunakan untuk menyebabkan penghentian program dengan segera. Itu tidak dapat ditangani atau diabaikan, dan karenanya selalu berakibat fatal. Juga tidak mungkin untuk memblokir sinyal ini.

CATATAN: SIGINT adalah apa yang dikirim ketika Anda menggunakan Ctrl+ Cuntuk "memecah" sebuah program dari baris perintah ketika sedang di tengah-tengah berjalan.

yang mana yang digunakan?

Kemungkinan besar SIGTERMini dipanggil oleh lingkungan windowing Anda dan diturunkan ke terminal Anda. Terminal Anda kemungkinan besar kemudian mengirim SIGHUPke MATLAB. Sinyal ini memberi semua proses kesempatan untuk melakukan pembersihan lokal (menutup file, mengakhiri proses, dll.) Sendiri.

bunuh perintah

Anda dapat mengirim sinyal sendiri menggunakan perintah dengan nama buruk kill,. Jadi untuk mengirim SIGTERMsinyal ke terminal Anda atau SIGHUP to MATLAB, you could determine their PID usingps` dan kemudian jalankan perintah ini untuk mengirim sinyal:

$ kill -SIGTERM <PID>

atau ini:

$ kill -SIGHUP <PID>

Anda bisa mendapatkan daftar lengkap sinyal menggunakan perintah ini:

$ 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
...
...

Perhatikan bahwa sinyal memiliki angka? Anda akan sering melihat mereka digunakan seperti itu alih-alih dengan nama mereka:

$ kill -15 <PID>

Atau yang terkenal -9, yang bisa membunuh hampir semua proses.

slm
sumber
Saya selalu berpikir angka-angka itu negatif, tetapi mereka sebenarnya argumen baris perintah. Saya belajar sesuatu yang baru: D
Thomas
1
HUP - HangUP - adalah sinyal yang dikirim jika Anda "kehilangan jalur" untuk terminal, misalnya Anda terhubung ke server Unix oleh modem. Itu mungkin sinyal yang paling "lembut" yang menghentikan suatu proses. Kebanyakan daemon tidak akan keluar tetapi baca kembali file konfigurasi mereka pada HUP. Perintah nohup memungkinkan Anda untuk membiarkan proses latar belakang berlanjut setelah shell ditutup. Perintah seperti layar selamat dari hangup dan mengisolasi perintah di dalamnya dari HUP.
Baard Kopperud
@ BaardKopperud - terima kasih, saya sengaja meninggalkan HUP, tidak ingin membingungkan diskusi.
slm
@ BaardKopperud - Saya pikir apa yang Anda tunjukkan adalah ini: "Sinyal SIGHUP dikirim ke proses ketika terminal pengendali ditutup. Awalnya dirancang untuk memberi tahu proses penurunan garis serial. Dalam sistem modern, sinyal ini biasanya berarti bahwa mengendalikan terminal semu atau virtual telah ditutup "Saya akui saya berbohong sedikit dalam uraian saya tetapi berusaha untuk membuatnya tetap sederhana.
slm
@ BaardKopperud - Saya merasa bersalah jadi saya telah memodifikasi jawaban saya untuk mencerminkan dengan lebih akurat apa yang terjadi. Terima kasih!
slm
2

Kemungkinan besar tidak masalah, tetapi Anda akan kehilangan data tergantung pada aplikasi apa yang Anda buka. Misalnya, jika Anda memiliki editor file terbuka, Anda mungkin kehilangan beberapa perubahan Anda jika Anda tidak menyimpan dan keluar dengan benar. Jika Anda khawatir, cukup logout / keluar dari terminal dengan benar. Jika Anda tidak suka mengetik exitatau logoutcoba saja Ctrl-D.

Menandai
sumber
Mengapa itu lebih baik? Aplikasi ini akan mendapatkan SIGHUP bukan SIGTERM, tetapi masih terbunuh oleh sinyal, jadi saya tidak akan menyebutnya "simpan dan keluar dengan benar"
Michael Mrozek
Sejauh ini Ctrl-D, itu hanya berlaku pada command prompt.
Markus