GNU/Linux >> Linux の 問題 >  >> Linux

zshですべてのバックグラウンドプロセスを強制終了するには?

これは ZSH と 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 の回答がうまくいきませんでした。

詳細はこちら:https://gist.github.com/CMCDragonkai/6084a504b6a7fee270670fc8f5887eb4


builtin を使用する必要があります 他の kill と一緒に zsh 組み込みコマンド zsh 組み込みコマンドとして:

builtin kill %1

kill として 別のバイナリファイルでもあります util-linux から /usr/bin/kill にあるパッケージ (アップストリーム、ミラー) 仕事をサポートしていない (kill: cannot find process "%1" ).

キーワード builtin を使用 名前の衝突や enable を避けるため kill 無効になっている場合は組み込み。

組み込みコマンド (つまり、cd などのシェル独自のコマンド) を無効化および有効化するという概念があります。 と kill ) シェルでは、zsh では kill を有効 (無効) にすることができます 組み込み:

enable kill

disable を発行 ビルトインが無効になっているかどうかを確認する (および enable 有効なものを表示します)。


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

.これは zsh であり、外部ツールは必要ありません。

ジョブ番号 N を殺したい場合:

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

@Zxy の応答に対する微調整...

私のシステムでは、中断されたジョブがデフォルトの kill シグナルで適切に強制終了されないことがわかりました。実際に kill -KILL に変更する必要がありました suspended を取得するには バックグラウンド ジョブが適切に終了します。

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

この周りの単一引用符に特に注意してください。二重引用符に切り替えた場合は、それぞれの「$」をエスケープする必要があります。 function は使用できないことに注意してください 関数は $jobstates をインクリメントするため、このコマンドをラップします。 関数が自分自身を強制終了しようとする配列...エイリアスを使用する必要があります。

killjob 上記のスクリプトは、次のように実行できるため、少し冗長です:

kill %1

キーストロークが少なく、すでに zsh に組み込まれています .


Linux
  1. Centos7で`user`が所有するすべてのプロセスを強制終了する方法は??

  2. 特定のプロセスを除くすべてのプロセスを強制終了する方法は?

  3. SSH経由で特定のユーザーのすべてのプロセスを強制終了します

  1. すべての子プロセスを見つける方法は?

  2. pgrep によって返されたすべてのプロセスを強制終了する方法

  3. Ctrl+C を使用して、Bash スクリプトで開始されたすべてのバックグラウンド プロセスを強制終了する方法は?

  1. UID を使用してすべてのユーザーのプロセスを強制終了するにはどうすればよいですか

  2. アプリケーションに関連するすべてのプロセスを強制終了します

  3. t よりも古いプロセスを強制終了するにはどうすればよいですか?