Hentikan setiap proses latar belakang

10

Saya memiliki beberapa Stoppedproses latar belakang.

kill $(jobs -p)dan kill `jobs -p`tidak berpengaruh

kill %1,, kill %2dll. berhasil menghentikan proses individu

Bagaimana saya bisa membunuh setiap proses latar belakang dengan satu perintah?

Juga, mengapa dua perintah pertama tidak bekerja untuk saya?

Saya menjalankan Linux Mint 15, 64 bit

pengguna49888
sumber

Jawaban:

10

Saat mereka berlari

Sepertinya Anda bisa melakukan ini dengan killdan output dari jobs -p.

Contoh

$ sleep 1000 &
[1] 21952
$ sleep 1000 &
[2] 21956
$ sleep 1000 &
[3] 21960

Sekarang saya memiliki 3 pekerjaan palsu yang sedang berjalan.

$ jobs
[1]   Running                 sleep 1000 &
[2]-  Running                 sleep 1000 &
[3]+  Running                 sleep 1000 &

Bunuh mereka semua seperti ini:

$ kill $(jobs -p)
[1]   Terminated              sleep 1000
[2]-  Terminated              sleep 1000
[3]+  Terminated              sleep 1000

Mengkonfirmasikan mereka semua pergi.

$ jobs
$

Ketika mereka berhenti

Jika Anda memiliki pekerjaan yang dihentikan, bukan menjalankan Anda sebagai gantinya.

Contoh

$ kill $(jobs -p)

$ jobs
[1]+  Stopped                 sleep 1000
[2]-  Stopped                 sleep 1000
[3]   Stopped                 sleep 1000

OK jadi itu tidak membunuh mereka, tapi itu karena sinyal mematikan tidak dapat ditangani oleh proses itu sendiri, itu berhenti. Jadi beritahu OS untuk melakukan pembunuhan sebagai gantinya. Itu untuk apa -9.

$ kill -9 $(jobs -p)
[1]+  Killed                  sleep 1000
[2]-  Killed                  sleep 1000
[3]   Killed                  sleep 1000

Itu lebih baik.

$ jobs
$ 

Ketika beberapa berjalan dan beberapa dihentikan

Jika Anda memiliki kantong campuran proses di mana beberapa berhenti dan beberapa berjalan Anda dapat melakukan yang killpertama diikuti oleh a kill -9.

$ kill $(jobs -p); sleep <time>; \
    kill -18 $(jobs -p); sleep <time>; kill -9 $(jobs -p)

Perpanjang waktu sedikit jika Anda membutuhkan lebih banyak untuk memungkinkan proses untuk menghentikan diri mereka sendiri terlebih dahulu.

Sinyal

HUP (-1) atau SIGTERM (-15) untuk dibunuh tidak akan berhasil. Tapi kenapa? Itu karena sinyal-sinyal ini lebih ramah dalam arti mereka memberitahu aplikasi untuk menghentikannya sendiri. Tetapi karena aplikasi dalam keadaan berhenti itu tidak dapat memproses sinyal-sinyal ini. Jadi Anda hanya menggunakan SIGKILL (-9).

Anda dapat melihat semua sinyal yang killdisediakan kill -l.

$ kill -l | column -t
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
16)  SIGSTKFLT    17)  SIGCHLD      18)  SIGCONT      19)  SIGSTOP      20)  SIGTSTP
21)  SIGTTIN      22)  SIGTTOU      23)  SIGURG       24)  SIGXCPU      25)  SIGXFSZ
26)  SIGVTALRM    27)  SIGPROF      28)  SIGWINCH     29)  SIGIO        30)  SIGPWR
31)  SIGSYS       34)  SIGRTMIN     35)  SIGRTMIN+1   36)  SIGRTMIN+2   37)  SIGRTMIN+3
38)  SIGRTMIN+4   39)  SIGRTMIN+5   40)  SIGRTMIN+6   41)  SIGRTMIN+7   42)  SIGRTMIN+8
43)  SIGRTMIN+9   44)  SIGRTMIN+10  45)  SIGRTMIN+11  46)  SIGRTMIN+12  47)  SIGRTMIN+13
48)  SIGRTMIN+14  49)  SIGRTMIN+15  50)  SIGRTMAX-14  51)  SIGRTMAX-13  52)  SIGRTMAX-12
53)  SIGRTMAX-11  54)  SIGRTMAX-10  55)  SIGRTMAX-9   56)  SIGRTMAX-8   57)  SIGRTMAX-7
58)  SIGRTMAX-6   59)  SIGRTMAX-5   60)  SIGRTMAX-4   61)  SIGRTMAX-3   62)  SIGRTMAX-2
63)  SIGRTMAX-1   64)  SIGRTMAX

Jika Anda ingin mempelajari lebih lanjut tentang berbagai sinyal, saya sangat menyarankan seseorang untuk melihat halaman manual sinyal man 7 signal,.

slm
sumber
mengapa kita memiliki +simbol untuk proses pertama dan -simbol untuk proses kedua dan tidak ada simbol di proses ketiga?
Ramesh
Saya mendapat hasil yang sama seperti Anda. Namun saya ingin terminatebukannya kill, karena saya sudah membaca yang lebih aman. Saya mencoba kill -15 $(jobs -p), tetapi itu tidak berpengaruh. Saya menduga bahwa proses yang terhenti hanya dapat dimatikan, tetapi sekali lagi kill %numbermenghentikan proses (individu) yang terhenti.
user49888
@ Ramesh The +dan -hanya proses terakhir yang saya sentuh ketika saya menyiapkan contoh. The +berarti bahwa setiap perintah yang tidak secara eksplisit termasuk %#akan bertindak atas perintah itu. Tanda hubung ( -) adalah perintah ke-2 hingga terakhir yang saya sentuh.
slm
@ user49888 - kill -9 .. seharusnya sudah berfungsi. apa prosesnya? Apakah prosesnya mati atau yatim?
slm
1
@ user49888 - ya jika prosesnya di tengah-tengah sesuatu itu tidak diberi kesempatan untuk melakukan pembersihan sebelum diakhiri.
slm
2

Anda bisa mencoba ini.

for x in `jobs -p`; do kill -9 $x; done

Namun, jika Anda ingin menghentikan proses, Anda dapat mengeluarkan perintah sebagai,

for x in `jobs -p`; do kill -15 $x; done

Dari halaman WikiKill perintah ,

Suatu proses dapat mengirim sinyal SIGTERM dalam empat cara (ID proses adalah '1234' dalam kasus ini):

kill 1234
kill -s TERM 1234
kill -TERM 1234
kill -15 1234

Proses dapat mengirim sinyal SIGKILL dalam tiga cara:

kill -s KILL 1234
kill -KILL 1234
kill -9 1234

Seperti yang dijelaskan dalam jawaban ini , ini adalah perbedaan antara mengakhiri dan membunuh .

Sinyal terminasi, SIGTERM , adalah sinyal yang dapat dicegat dalam suatu program. Seringkali proses yang dimaksudkan untuk berjalan di latar belakang akan menangkap sinyal ini dan memulai proses penonaktifan, menghasilkan jalan keluar yang bersih. Sinyal bunuh, SIGKILL , tidak dapat dicegat. Ketika ini dikirim ke suatu proses, itu akan mengakibatkan penghentian mendadak dari program itu.

Ketika Anda mematikan atau menyalakan ulang komputer Anda misalnya, biasanya SIGTERM dikirim ke proses yang berjalan terlebih dahulu yang memungkinkan mereka keluar dengan cara yang bersih jika mereka mendukungnya. Kemudian, setelah beberapa detik SIGKILL dikirim ke proses yang masih berjalan sehingga sumber daya yang digunakan dilepaskan secara paksa (misalnya file yang digunakan) dan urutan pematian dapat dilanjutkan (mis. Unmount sistem file).

Ramesh
sumber
Ini melakukan killsetiap proses latar belakang. Namun, apakah ada cara lain bagi terminatemereka, karena saya percaya itu lebih aman?
user49888
Jika Anda ingin mengakhiri, Anda dapat menggunakan -15perintah kill.
Ramesh
-15juga tidak akan bekerja di sini. Lihat A. saya
slm
@ Ramesh - 2 paragraf terakhir tidak tepat. SIGTERM tidak terkirim (bukan awalnya). Proses dicoba untuk dihentikan dulu melalui skrip berhenti / mulai layanan yang ada. Jika itu adalah kasus bahwa 9 dikirim ke proses maka dengan proses berhenti seperti pada contoh OP, kill -9dalam contoh saya tidak akan berhasil.
slm
1

Ok, bermain-main dengan ini saya melihat bahwa ketika Anda membunuh pekerjaan yang dihentikan (di mana eksekusi telah dijeda tetapi tidak dihentikan), maka itu tidak akan selesai sampai dibawa ke latar depan. Program biasanya dihentikan dengan menekan Ctrl- Zpada terminal. Sebagian besar terminal mengirim SIGSTOPdalam hal ini, tetapi tentu saja ada juga cara lain untuk mengirimkannya seperti dengan kill -STOPataukill -19 .

Ini adalah perilaku normal untuk program tidak menyelesaikan segera karena program harus berjalan untuk memproses SIGTERMsinyal default yang dikirim oleh kill. Selain itu, kadang-kadang setelah bashmengirim SIGTERMke proses latar belakang, entah bagaimana akhirnya terhenti (meskipun SIGTERMmasih tertunda).

Cara teraman untuk menyelesaikan semua pekerjaan ( tanpa terpaksa kill -9) pertama-tama adalah mengirim SIGTERMdengan normal kill, kemudian mengirim SIGCONTke pekerjaan yang tersisa, misalnya:

kill $(jobs -p)
kill -18 $(jobs -p)

The SIGCONT( 18adalah jumlah sinyal) akan membawa setiap pekerjaan berhenti menjadi latar depan sehingga mereka dapat memproses SIGTERMkarena mereka biasanya.

Jika semua program tidak selesai dengan ini, maka ada beberapa sinyal lain yang dapat Anda coba yang biasanya membuat proses selesai, sebelum beralih ke kill -9. Yang pertama saya sarankan adalah SIGHUPkarena banyak program yang biasanya memblokir sinyal terminasi lainnya merespons SIGHUP. Ini biasanya dikirim ketika terminal pengendali ditutup, khususnya dikirim ketika sshsesi dengan ttyselesai. Banyak program interaktif, seperti shell, tidak akan menanggapi sinyal terminasi lain tetapi akan melakukan hal ini karena akan menjadi masalah bagi mereka untuk tetap berjalan setelah sshsesi selesai (atau setelah terminal pengendali ditutup). Untuk mencoba ini Anda bisa melakukannya

kill -1 $(jobs -p)
kill -18 $(jobs -p)

Sekali lagi tentu saja Anda perlu memastikan program tidak berhenti sehingga dapat memproses sinyal. Sinyal terminasi lain yang dapat Anda coba adalah SIGINT( kill -2) dan SIGQUIT( kill -3). Tapi tentu saja manfaat dari mencoba berbagai berkurang dan dapat menyebabkan tak terhindarkan SIGKILL(alias kill -9).

Graeme
sumber
Jika Anda melakukannya, man signalAnda bisa mendapatkan bahan referensi untuk mendukung ini.
slm
Ini adalah bentuk yang lebih lembut dari apa yang A saya sarankan. Ada beberapa contoh di mana saya pernah bertemu di masa lalu di mana ini masih tidak akan membereskan semuanya jadi jika Anda melakukan ini dari skrip kill -9 ..metode ini akan bekerja dalam banyak kasus. Ini kadang-kadang akan meninggalkan proses berkeliaran, sehingga akan gagal lebih banyak waktu. Ini adalah trade off yang harus Anda putuskan. Lebih baik menjadi tangan berat dan membunuh segalanya, mempertaruhkan data / pembersihan vs memiliki pembersihan lebih lembut, tetapi harus melakukan lebih banyak analisis karena pembunuhan Anda semakin keras.
slm
@slm, Anda harus menghindari kill -9sedapat mungkin karena ini hanya menarik steker tanpa memberi program kesempatan untuk membersihkan dengan benar. Saya akan memperbarui dengan beberapa alternatif.
Graeme
Seperti yang saya katakan rasa Anda lebih lembut daripada apa yang saya sarankan, itu tergantung pada apa yang Anda coba lakukan vs bersedia untuk mentolerir dari perspektif risiko. Saya telah menggunakan metode Anda dan juga metode saya. Keduanya IMO yang benar. Juga a kill ..; sleep <time>; kill -18 ..; tidur <waktu>; bunuh -9 ... . Basically working up to the -9`.
slm
@slm, kill -18itu pasti sesuatu yang harus digunakan karena sudah umum berhenti pekerjaan (dan dalam beberapa kasus tampaknya bashentah bagaimana berhenti menjalankan pekerjaan sebelum mengirim SIGTERM). Seperti yang ditambahkan di atas SIGHUPjuga patut dicoba karena banyak program yang tidak menanggapi yang lain akan menanggapi ini (coba dengan shell). Di luar itu, ya, itu tidak begitu berharga karena SIGKILLmungkin tidak bisa dihindari.
Graeme
0

Ini akan menghentikan semua pekerjaan di shell Anda saat ini satu per satu:

while kill %; do :; done

Penjelasan: %mengacu pada pekerjaan terakhir dalam daftar, sehingga akan berulang hingga killmengembalikan nilai bukan nol, yang berarti tidak ada lagi pekerjaan yang harus diberhentikan.

Pendekatan lain mungkin adalah pengiriman pertama SIGTERM, maka SIGCONTagar pekerjaan Anda dapat dilanjutkan dan hal pertama yang akan mereka lakukan adalah menerima Anda SIGTERM.

/bin/kill $(jobs -p) && /bin/kill -CONT $(jobs -p)

(untuk beberapa alasan built-in killaneh, jadi saya menggunakan yang eksternal di sini).

dnt
sumber