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.
@ 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.
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.
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.
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.
Jawaban:
Ada variabel khusus untuk ini di bash:
$! memperluas ke PID dari proses terakhir yang dijalankan di latar belakang.
sumber
^Z
bukan latar belakang pekerjaan, itu menghentikan mereka. Berikutnyabg
melakukan 'latar belakang' yang sebenarnya (melanjutkan eksekusi di latar belakang), dan setelah itu$!
berfungsi seperti yang diharapkan.????
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 menambahkanwait
(diikuti mungkin dengansync
atau bahkan asleep <n>
) tepat sebelum yang pertama dari perintah 'tergantung' tersebut.Anda dapat membunuh berdasarkan nomor pekerjaan. Saat Anda meletakkan tugas di latar belakang Anda akan melihat sesuatu seperti:
Itu
[1]
adalah nomor pekerjaan dan dapat dirujuk seperti:Untuk melihat daftar nomor pekerjaan gunakan
jobs
perintah. Lebih banyak dariman bash
:sumber
set -m
), ini dimaksudkan untuk penggunaan interaktif. Lihat stackoverflow.com/questions/690266/… juga%1
dan%%
- terutama. Beberapa hal tidak mati pada Ctrl-C, jadi Anda perlu Ctrl-Z, lalukill -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 melakukanps
atau mungkinjobs -l
, dan kemudian ketik ulang PID, yang membosankan.while true
denganwhile 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.Perintah berikut memberi Anda daftar semua proses latar belakang di sesi Anda, bersama dengan pid. Anda kemudian dapat menggunakannya untuk mematikan proses.
Contoh penggunaan:
sumber
Ini harus mematikan semua proses latar belakang:
sumber
kill -9 %%
kurang mengetik :)skill
adalah versi dari perintah kill yang memungkinkan Anda memilih satu atau beberapa proses berdasarkan kriteria yang diberikan.sumber
Anda memerlukan pid ... gunakan "ps -A" untuk menemukannya.
sumber
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.
sumber
Cukup gunakan perintah killall:
bunuh semua taskname
untuk info lebih lanjut dan opsi lebih lanjut, ketik "man killall".
sumber
killall python
ataukillall java
, sambil menjalankan sesuatu yang berguna di sistem.