Apakah ada bentuk pembunuhan latar belakang yang lebih ringkas daripada:
for i in {1..5}; do kill %$i; done
Juga, {1..5} jelas memiliki angka ajaib hard-coded di dalamnya, bagaimana saya bisa membuatnya "N" dengan N menjadi angka yang tepat, tanpa melakukan:
$(jobs | wc -l)
Saya benar-benar menggunakan \ j di PS1 untuk mendapatkan # pekerjaan terkelola, apakah ini setara?
kill $(jobs -p)
sepertinya lebih mudah.for pid in $(jobs -p); do kill $pid; done
?jobs
yang hanya berfungsi jika pekerjaan diberi nomor secara berurutan. Oh, dan “bunuh pekerjaan sendiri-sendiri” tidak ada artinya: meneruskan beberapa PID kekill
perintah melakukan hal yang persis sama dengan melewatkannya secara terpisah.Jawaban:
Untuk
kill
semua pekerjaan latar belakang yang dikelola olehbash
, lakukanPerhatikan bahwa karena keduanya
jobs
dankill
dibangun ke dalambash
, Anda tidak boleh mengalami kesalahan jenis daftar Argumen terlalu lama .sumber
zsh
mendiskualifikasi mereka sebagai pihak yang berwenang dalam topik tersebut.kill %${(k)^jobdirs}
, yang memang lebih panjang; jika Anda perlu membuat daftar PID maka Anda dapat menggunakannya lebih lama lagi${${jobstates#*:*:}%%=*}
.>
Gunakan
xargs
alih-alih$(jobs -p)
sub- perintah , karena jikajobs -p
kosong maka perintah kill akan gagal.sumber
jobs -p | xargs -rn10 kill
akan lebih baik jikajobs -p
tidak mengembalikan PID. Perhatikan bahwa-r
opsi adalah ekstensi GNU.-r
ini adalah format pendek untuk--no-run-if-empty
ekstensi GNUxargs
yang memerintahkannya untuk tidak menjalankan perintah jika stdin tidak memiliki data.Saya lebih suka memeriksa apakah ada pekerjaan yang ada sebelum membunuh mereka - dengan cara ini skrip tidak akan gagal jika tidak ada yang berjalan.
Ini juga lebih pendek untuk diketik. Lemparkan ini ke Anda
.bash_profile
:Lalu lari:
Untuk mematikan pekerjaan yang sedang berjalan.
sumber
Saya memiliki beberapa perintah majemuk latar belakang yang ingin saya akhiri dengan anggun, dengan mengirimkan SIGINT ke setiap proses, di macOS. Tidak ada solusi lain yang bekerja dengan baik untuk itu, jadi saya datang dengan ini:
jobs -p
daftar proses latar belakang yang dimulai oleh shell saat ini.xargs -n1
mengeksekusi pkill sekali untuk setiap pekerjaan.pkill -SIGINT -g
mengirimkan SIGINT (sama seperti ctrl + c) ke semua proses dalam grup proses.sumber
Saya kira tergantung pada apa yang
jobs -p
memberikan output , solusinya bisa sedikit berbeda. Dalam hal iniKarena itu, melakukan yang berikut ini tidak baik.
Di sisi lain, menjalankan
kill $(jobs -p)
tidak berfungsi tetapi memerlukan banyak pesan kesalahan, karena string non-PID diteruskankill
juga.Oleh karena itu, solusi saya adalah dengan
grep
PID terlebih dahulu dan kemudian gunakanxargs
, sebagai berikut:sumber
echo $0
ditunjukkan? Apa yanghelp jobs
ditunjukkan? Output yang diilustrasikan tidak sesuai dengan POSIX ; implementasi apa punjobs
harus memiliki-p
opsi dengan perilaku yang dimaksud.jobs -p
hanya menghasilkan PID. Saya baru saja belajar bahwa zsh tidak sepenuhnya kompatibel dengan POSIX.Sepertinya
jobs -p | xargs kill
melakukan pekerjaan itu, namun menghasilkan beberapa keluaran yang tidak diinginkan untuk dimatikan. Di sini saya mengelompokkan outputjobs -p
dengan memiliki / tidak memiliki karakter + atau -Dan nanti Anda bisa menelepon
killjobs
sumber