linux: membunuh tugas latar belakang

194

Bagaimana cara saya mematikan tugas latar belakang yang terakhir muncul di linux?

Contoh:

doSomething
doAnotherThing
doB &
doC
doD
#kill doB
????
flybywire
sumber
18
Bagaimana ini tidak terkait pemrograman? Pemrograman bash bukan pemrograman?
flybywire
6
Ini berada di wilayah tumpang tindih antara SO dan SU, tapi saya pikir ini lebih cocok di sini di SO. Kriteria saya untuk berpikir seperti ini adalah jika @flybywire melakukan ini dalam sebuah skrip, itu adalah pemrograman. Jika dia hanya ingin melakukannya dari baris perintah, saya akan mengatakan itu milik SU.
Bill the Lizard
10
Shell scripting juga pemrograman.
cletus

Jawaban:

234

Ada variabel khusus untuk ini di bash:

kill $!

$! memperluas ke PID dari proses terakhir yang dijalankan di latar belakang.

Falstro
sumber
68
@ polm23; tidak, ^Zbukan latar belakang pekerjaan, itu menghentikan mereka. Berikutnya bgmelakukan 'latar belakang' yang sebenarnya (melanjutkan eksekusi di latar belakang), dan setelah itu $!berfungsi seperti yang diharapkan.
falstro
Dengan asumsi ????singkatan dari satu atau lebih perintah yang akan dieksekusi setelah kill, jika salah satu dari perintah itu bergantung pada pekerjaan yang dilakukan oleh proses latar belakang, berhati-hatilah dengan tugas pembersihan atau penyelesaian yang proses latar belakang mungkin lakukan dalam penangan sinyal setelah menerima sinyal (trappable). Terbaik untuk menambahkan wait(diikuti mungkin dengan syncatau bahkan a sleep <n>) tepat sebelum yang pertama dari perintah 'tergantung' tersebut.
ack
2
Untuk penyelesaian: Karena satu% juga merujuk ke pekerjaan saat ini Anda dapat membunuh pekerjaan yang dihentikan (^ z) dengan "kill%". Saya menggunakan ini hampir selalu setelah ^ z.
t3o
Ini hanya berfungsi jika Anda memiliki kontrol pekerjaan diaktifkan, yang hanya aktif secara default di shell interaktif (meskipun karena Anda merujuk menggunakan ctrl-z saya kira Anda juga mengacu pada menggunakan shell interaktif) - tetapi ini telah dijabarkan dalam jawaban lain di sini, tidak yakin mengapa ini "untuk kelengkapan" :)
falstro
289

Anda dapat membunuh berdasarkan nomor pekerjaan. Saat Anda meletakkan tugas di latar belakang Anda akan melihat sesuatu seperti:

$ ./script &
[1] 35341

Itu [1]adalah nomor pekerjaan dan dapat dirujuk seperti:

$ kill %1
$ kill %%  # Most recent background job

Untuk melihat daftar nomor pekerjaan gunakan jobsperintah. Lebih banyak dari man bash:

Ada beberapa cara untuk merujuk ke suatu pekerjaan di shell. Karakter %memperkenalkan nama pekerjaan. Nomor pekerjaan ndapat disebut sebagai %n. Pekerjaan juga dapat disebut menggunakan awalan nama yang digunakan untuk memulainya, atau menggunakan substring yang muncul di baris perintahnya. Misalnya, %cemerujuk pada cepekerjaan yang berhenti . Jika awalan cocok dengan lebih dari satu pekerjaan, bash melaporkan kesalahan. Menggunakan %?ce, di sisi lain, mengacu pada pekerjaan apa pun yang mengandung string cedi baris perintahnya. Jika substring cocok dengan lebih dari satu pekerjaan, bash melaporkan kesalahan. Simbol %%dan%+lihat gagasan shell tentang pekerjaan saat ini, yang merupakan pekerjaan terakhir dihentikan saat berada di latar depan atau dimulai di latar belakang. Pekerjaan sebelumnya dapat dirujuk menggunakan %-. Dalam output yang berkaitan dengan pekerjaan (misalnya, output dari perintah pekerjaan), pekerjaan saat ini selalu ditandai dengan a +, dan pekerjaan sebelumnya dengan a -. Satu %(tanpa spesifikasi pekerjaan yang menyertai) juga mengacu pada pekerjaan saat ini.

John Kugelman
sumber
Sebagai catatan, saya pikir ini hanya berfungsi jika kontrol pekerjaan diaktifkan. Meskipun saya pikir Anda dapat menyalakannya di skrip ( set -m), ini dimaksudkan untuk penggunaan interaktif. Lihat stackoverflow.com/questions/690266/… juga
falstro
9
Simbol yang sangat berguna, ini %1dan %%- terutama. Beberapa hal tidak mati pada Ctrl-C, jadi Anda perlu Ctrl-Z, lalu kill -9 %%. Salah satu contoh di mana saya merasa berguna adalah: while true; do mplayer <some unstable online radio>; date >> restarts.log; done- Ctrl-C hanya akan membawa Anda ke iterasi loop berikutnya. Sebelum saya harus melakukan psatau mungkin jobs -l, dan kemudian ketik ulang PID, yang membosankan.
Tomasz Gandor
Apakah ada satu untuk semua pekerjaan?
CMCDragonkai
3
@TomaszGandor Itu sebabnya Anda mungkin ingin menggantinya while truedengan while sleep 1. Ini akan memberi Anda penundaan singkat sebelum memulai kembali jika Anda dapat hidup dengan itu, dan jika Anda menekan ctrl-c dua kali, yang kedua akan mengganggu tidur, mengakhirinya dengan jalan keluar nol dan keluar dari loop.
falstro
45

Perintah berikut memberi Anda daftar semua proses latar belakang di sesi Anda, bersama dengan pid. Anda kemudian dapat menggunakannya untuk mematikan proses.

jobs -l

Contoh penggunaan:

$ sleep 300 &
$ jobs -l
[1]+ 31139 Running                 sleep 300 &
$ kill 31139
Dave Vogt
sumber
25

Ini harus mematikan semua proses latar belakang:

jobs -p | xargs kill -9
Prabhu Are
sumber
1
Ini adalah apa yang saya gunakan sebelumnya, tetapi kill -9 %%kurang mengetik :)
Tomasz Gandor
4
@TomaszGandor Itu hanya akan mematikan pekerjaan saat ini yaitu pekerjaan terakhir berhenti di latar depan atau mulai di latar belakang. Perintah dalam jawabannya akan membunuh SEMUA pekerjaan.
bitek
4
jangan bunuh -9
lesmana
2
skill doB

skill adalah versi dari perintah kill yang memungkinkan Anda memilih satu atau beberapa proses berdasarkan kriteria yang diberikan.

gte525u
sumber
0

Anda memerlukan pid ... gunakan "ps -A" untuk menemukannya.

jldupont
sumber
0

ini adalah jawaban diluar topik, tetapi, bagi mereka yang tertarik, ini mungkin berharga.

Seperti pada jawaban @John Kugelman,% terkait dengan spesifikasi pekerjaan. bagaimana cara efisien menemukan itu? gunakan perintah less's & pattern , sepertinya man menggunakan less pager (tidak yakin), di man bash ketik &% lalu ketik Enter hanya akan menampilkan baris yang berisi '%', untuk mengatur ulang semua, ketik &. lalu Masuk.

qeatzy
sumber
-3

Cukup gunakan perintah killall:

bunuh semua taskname

untuk info lebih lanjut dan opsi lebih lanjut, ketik "man killall".

zakk
sumber
4
Saya pikir killall sedikit agresif ketika Anda benar-benar memiliki akses mudah ke PID. Dan berbahaya juga, terutama jika Anda root
Dave Vogt
3
Tidak terlalu membantu, jika Anda harus killall pythonatau killall java, sambil menjalankan sesuatu yang berguna di sistem.
Tomasz Gandor