Mengakhiri proses di Unix alih-alih memotongnya

12

Pada Unixbaris perintah jika saya menekan Ctrl-C, itu tidak mengakhiri proses, melainkan memotongnya dan saya kembali ke prompt shell.

Jadi, saya punya dua pertanyaan berikut:

    1. Apakah ada cara saya dapat melihat daftar semua proses yang terputus dan mengakhirinya?
    1. Kombinasi tombol apa yang harus ditekan untuk mengakhiri proses alih-alih memotongnya?
Nicolás Alarcón Rapela
sumber

Jawaban:

20

Ctrl+ Cmengirimkan a SIGINT. Secara default ini menghentikan aplikasi.

Anda membingungkan ini dengan Ctrl-Z, yang menangguhkan aplikasi di bash.

Ignacio Vazquez-Abrams
sumber
7

Secara historis ada tiga sinyal yang terikat dengan penekanan tombol ini

  • SIGINT (Intettput) biasanya Ctrl+ CatauDel
  • SIGQUIT - Quit - Biasanya terikat ke Ctrl+\
  • SIGSUSP Suspend - Biasanya terikat ke Ctrl+Z

Pada beberapa rasa * nix ada sinyal lain juga terikat, Anda dapat memeriksa binding keyboard menggunakan perintah

stty -a

Di sistem saya, OS / X, ini menghasilkan output berikut

speed 9600 baud; 65 rows; 213 columns;
lflags: icanon isig iexten echo echoe -echok echoke -echonl echoctl
    -echoprt -altwerase -noflsh -tostop -flusho pendin -nokerninfo
    -extproc
iflags: -istrip icrnl -inlcr -igncr ixon -ixoff ixany imaxbel iutf8
    -ignbrk brkint -inpck -ignpar -parmrk
oflags: opost onlcr -oxtabs -onocr -onlret
cflags: cread cs8 -parenb -parodd hupcl -clocal -cstopb -crtscts -dsrflow
    -dtrflow -mdmbuf
cchars: discard = ^O; dsusp = ^Y; eof = ^D; eol = <undef>;
    eol2 = <undef>; erase = ^?; intr = ^C; kill = ^U; lnext = ^V;
    min = 1; quit = ^\; reprint = ^R; start = ^Q; status = ^T;
    stop = ^S; susp = ^Z; time = 0; werase = ^W;

Harap perhatikan kill dalam contoh ini bukan sinyal KILL, ini berkaitan dengan membersihkan buffer input saat ini.

Anda mungkin lebih berhasil dengan menghentikan proses menggunakan SIGQUIT, tetapi ini mungkin tidak benar karena proses mungkin menangkap sinyal dan mengabaikannya.

Tidak ada konsep daftar proses "terganggu" karena proses telah menangkap dan mengabaikan interupsi atau telah keluar. Anda bisa mendapatkan daftar proses yang ditangguhkan dengan mengetik pekerjaan

Steve Weet
sumber
Sangat menarik bahwa saya menunjukkan ^ Q dan ^ S (seperti Anda) tetapi telah diatur stty -ixonsehingga mereka dilewati. Saya pikir mereka akan berubah <undef>.
Dijeda sampai pemberitahuan lebih lanjut.
Saya tidak menemukan SIGSUSP di halaman manual dari kotak OS X saya atau kotak Debian Lenny saya. Tampaknya menjadi SIGTSTP.
dmckee --- ex-moderator kitten
DEL - ah, Paket 9 ...
new123456
5

Banyak jawaban yang benar, tetapi tidak ada yang lengkap.

  1. Seperti yang banyak orang lain katakan: Control-C biasanya mengirimkan sinyal unix SIGINT dan perilaku default (dari program yang tidak menimpanya) adalah "mengakhiri proses". Program dapat mengabaikan sinyal ini atau mengambil tindakan berbeda jika diinginkan.
  2. Anda juga dapat mengirim SIGQUIT dari keyboard dengan Control- \. Perbedaannya di sini adalah bahwa secara default proses akan menulis file inti, lalu berhenti. Program dapat mengabaikan sinyal ini atau mengambil tindakan berbeda jika diinginkan.
  3. Untuk mengakhiri dengan prasangka ekstrem dan tanpa mengizinkan proses untuk menghentikan Anda menggunakan SIGKILL, yang tidak terikat pada tombol apa pun secara default. Sebagai gantinya, Anda biasanya mengirimnya menggunakan kill (1)perintah dan menentukan sinyal untuk dikirim seperti pada

    $ kill -9 <process ID>
    

    atau mnemonically

    $ kill -KILL <process ID>
    

    Sinyal ini ditangani langsung oleh OS dan program tidak dapat mengesampingkan perilaku default.

  4. Jika shell Anda mendukung kontrol pekerjaan, itu juga dapat mendukung versi killbawaan yang mendukung identifikasi pekerjaan menggunakan %karakter seperti pada jawaban catwalk .

  5. Untuk menjeda suatu proses dengan cara resume Anda dapat menggunakan Control-z yang mengirim SIGTSTP. Anda melanjutkan proses seperti itu dengan fgterus mengendalikan terminal atau bgmembuatnya beroperasi tanpa mengendalikan terminal (tetapi, secara default, masih mengirimkan hasilnya di sana).
dmckee --- mantan kucing moderator
sumber
Juga, dumping core pada SIGQUIT tergantung pada banyak detail administrasi. ulimit -c, coreadm (1M) pada Solaris dll. Catatan lain - fg mengirim sinyal SIGCONT, yang membuat proses melanjutkan operasinya.
Tadeusz A. Kadłubowski
1
  1. untuk melihat daftar proses latar belakang: jobs

    untuk membunuh: kill %1(gantikan 1 dengan id pekerjaan yang sesuai seperti dalam jobsoutput)

  2. lihat di sini
Komunitas
sumber
1

Ctrl-C mengirimkan SIGINT, yang secara default menyebabkan proses berakhir, tetapi dapat terjebak (dalam \bin sh, menggunakan trap).

SIGKILL adalah sinyal mematikan yang tidak bisa disangkal.

Sunting Ketiga kalinya, saya pikir ini benar: Saya sudah memeriksa semuanya terhadap dokumen. Kita lihat saja nanti.

Charles Stewart
sumber
SIGKILL tidak dapat dijebak.
Ya. Saya sudah memperbaikinya ...
Charles Stewart
1

Ini tidak jelas bagi kebanyakan pemula terminal, tetapi jika masalah Anda hanya karena Anda berada dalam program interaktif dan Anda tidak dapat menemukan cara untuk keluar, cukup sering qkeluar. Misalnya, ini adalah kunci untuk keluar less, yang juga merupakan program yang Anda dapatkan ketika Anda melihat manhalaman, antara lain.

Beberapa program memiliki cara pintas keyboard lain untuk keluar. Dalam vimatau vi, gunakan ESC:wq. Di emacs, gunakan Control-C Control-X. Dalam nanoatau pico, gunakan Control-X. Perhatikan bahwa dalam contoh-contoh ini ada seluk-beluk, khususnya, tentang apakah pintasan itu menyimpan perubahan apa pun yang mungkin Anda buat pada file yang Anda edit.

penilai
sumber
Jadi apa standarnya?
Pacerier
0

Banyak proses dapat menginstal interrupt handler untuk menangkap sinyal interupsi, tetapi yang tidak akan dibatalkan secara default.

Untuk memaksa proses berhenti, Anda dapat mengirim SIGQUIT (Ctrl- \).

njd
sumber
SIGQUIT bisa terjebak, SIGKILL tidak bisa.
Charles Stewart
1
@ Charles: perbedaan lain adalah bahwa SIGQUIT secara default membuang inti, SIGKILL tidak.
Tadeusz A. Kadłubowski
0

Tampaknya jawaban lain adalah skenario yang mungkin, tetapi juga mungkin bahwa Anda menjalankan skrip yang tidak menangani anak-anaknya dengan benar. Saya baru-baru ini mencapai skenario yang sama, di mana membunuh skrip tidak akan membunuh proses anak skrip itu.

Secara umum, jika Anda masuk ke situasi ini, Anda harus meninjau semua proses yang sedang Anda jalankan. Anda harus meninjau halaman manual untuk ps. ( man ps) Saya sangat suka menggunakan ps auxwf, yang menunjukkan hubungan orangtua / anak antara proses. pstreemelakukan sesuatu yang serupa. Anda harus menjalankan ini dari terminal lain sebelum mematikan proses untuk melihat seperti apa keadaan dalam situasi normal, dan mengidentifikasi proses anak.

Jika Anda kemudian membunuh (dengan ^ C) proses utama itu, periksa output ps lagi untuk melihat apakah ada yang berubah. Jika proses anak masih ada, Anda dapat membunuh mereka dengan killperintah. (lihat man kill)

POHON
sumber