GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana cara mematikan semua proses latar belakang di zsh?

Ini berfungsi untuk ZSH dan Bash:

: '
killjobs - Run kill on all jobs in a Bash or ZSH shell, allowing one to optionally pass in kill parameters

Usage: killjobs [zsh-kill-options | bash-kill-options]

With no options, it sends `SIGTERM` to all jobs.
'
killjobs () {

    local kill_list="$(jobs)"
    if [ -n "$kill_list" ]; then
        # this runs the shell builtin kill, not unix kill, otherwise jobspecs cannot be killed
        # the `[email protected]` list must not be quoted to allow one to pass any number parameters into the kill
        # the kill list must not be quoted to allow the shell builtin kill to recognise them as jobspec parameters
        kill [email protected] $(sed --regexp-extended --quiet 's/\[([[:digit:]]+)\].*/%\1/gp' <<< "$kill_list" | tr '\n' ' ')
    else
        return 0
    fi

}

@zyx answer tidak berhasil untuk saya.

Lebih lanjut di sini:https://Gist.github.com/CMCDragonkai/6084a504b6a7fee270670fc8f5887eb4


seseorang harus menggunakan builtin perintah bawaan zsh bersama dengan kill lainnya zsh perintah bawaan sebagai:

builtin kill %1

sebagai kill juga merupakan file biner yang terpisah dari util-linux paket (upstream, mirror) terletak di /usr/bin/kill yang tidak mendukung pekerjaan (kill: cannot find process "%1" ).

gunakan kata kunci builtin untuk menghindari konflik nama atau enable kill bawaan jika dinonaktifkan.

ada konsep menonaktifkan dan mengaktifkan perintah bawaan (mis. perintah Shell sendiri seperti cd dan kill ) di shell, dan di zsh Anda dapat mengaktifkan (dinonaktifkan) kill bawaan sebagai:

enable kill

keluarkan disable untuk memeriksa apakah builtin dinonaktifkan (dan enable untuk melihat yang diaktifkan).


alias killbg='kill ${${(v)jobstates##*:*:}%=*}'

. Itu zsh, tidak perlu alat eksternal.

Jika Anda ingin membunuh pekerjaan nomor N:

function killjob()
{
    emulate -L zsh
    for jobnum in [email protected] ; do
        kill ${${jobstates[$jobnum]##*:*:}%=*}
    done
}
killjob N

Penyesuaian kecil pada respons @Zxy...

Di sistem saya, saya menemukan bahwa pekerjaan yang ditangguhkan tidak dimatikan dengan benar dengan sinyal mematikan default. Saya harus benar-benar mengubahnya menjadi kill -KILL untuk mendapatkan suspended pekerjaan latar belakang untuk mati dengan benar.

alias killbg='kill -KILL ${${(v)jobstates##*:*:}%=*}'

Berikan perhatian khusus pada KUTIPAN TUNGGAL di sekitar ini. Jika Anda beralih ke tanda kutip ganda, Anda harus keluar dari setiap "$". Perhatikan bahwa Anda TIDAK dapat menggunakan function untuk membungkus perintah ini karena fungsi akan menambah $jobstates array yang menyebabkan fungsi mencoba mematikan dirinya sendiri... Harus menggunakan alias.

killjob skrip di atas agak berlebihan karena Anda bisa melakukan:

kill %1

Lebih sedikit penekanan tombol dan sudah dibuat menjadi zsh .


Linux
  1. Bagaimana Cara Membunuh Semua Proses Selain Proses Tertentu?

  2. Bunuh semua proses pengguna tertentu melalui SSH

  3. Bagaimana menemukan semua proses anak?

  1. Cara mematikan semua proses yang dikembalikan oleh pgrep

  2. Bagaimana cara menggunakan Ctrl+C untuk mematikan semua proses latar belakang yang dimulai dalam skrip Bash?

  3. Bagaimana cara mematikan semua proses pengguna menggunakan UID mereka

  1. Bagaimana Cara Membunuh Semua Proses yang Dimiliki Oleh `pengguna` Di Centos 7??

  2. Cara Membunuh Proses yang Berjalan di Linux

  3. Bunuh semua proses yang terkait dengan aplikasi