grepにヒットしたすべてのプロセスを終了するためのエイリアス[重複]

grepにヒットしたすべてのプロセスを終了するためのエイリアス[重複]

grep一致に一致するすべてのプロセスを終了するためにスーパーキルエイリアスを作成しようとしています。私がしたい:

superkill ruby

「ruby」に一致するすべてのプロセスを終了させます。

私は.bashrcにこれを追加しました。

alias superkill="ps ax | grep $1 | cut -f1 -d' ' | xargs kill"

ただし、実行すると、次のような結果が表示されます。

superkill something
usage: grep [-abcDEFGHhIiJLlmnOoqRSsUVvwxZ] [-A num] [-B num] [-C[num]]
    [-e pattern] [-f file] [--binary-files=value] [--color=when]
...

誰もが正しい方向に私を指すことができますか?

ありがとう、ケビン


これはコピーとは異なります。具体的な質問をさせていただきます。重複は一般的で高レベルの問題です。コピーを読んでも解決策は思い出されません。

pkill -f動作しません。そうすれば

ps -A|grep ruby

それから

pkill -f ruby

それから

ps -A|grep ruby

Rubyプロセスがまだ存在することがわかります。しかし、もしそうするなら

kill -9 xxx

xxxがPIDの場合は機能します。私が探しているのは、grepエントリと一致するエイリアスkill -9です。

アップデート - これはSOに対する私の欲求不満を思い出させます。誰もがすぐに反対票を投げたり報告したりします(報告する価値がほとんどないと思います)。提案された答えのどれも機能しない別の例は次のとおりです。

kevin@kpi-2:~/Documents/code/kpi-veh$ sudo killall -r ruby
kevin@kpi-2:~/Documents/code/kpi-veh$ ps -A|grep ruby
27175 pts/9    00:22:03 ruby
kevin@kpi-2:~/Documents/code/kpi-veh$ sudo killall -r ruby
kevin@kpi-2:~/Documents/code/kpi-veh$ ps -A|grep ruby
27175 pts/9    00:22:06 ruby
kevin@kpi-2:~/Documents/code/kpi-veh$ sudo killall -r ruby
kevin@kpi-2:~/Documents/code/kpi-veh$ ps -A|grep ruby
27175 pts/9    00:22:08 ruby
kevin@kpi-2:~/Documents/code/kpi-veh$ kill -9 27175
kevin@kpi-2:~/Documents/code/kpi-veh$

私が探しているのは(これが詐欺だとロビーモニターと論争をしていることをまだ信じられない)エイリアスキル方法です。この場合(Rubyで頻繁に発生する)、IDでプロセスを終了する必要があります。私が知っている限り、すべてのバリエーションでkillallは機能しません。

答え1

探しているアイテムはすでに次の名前で存在しますkillall -r

killall指定されたコマンドを実行するすべてのプロセスにシグナルを送信します。信号名が指定されていない場合にSIGTERM送信されます。 [...]

-r、--正規表現

プロセス名パターンを拡張正規表現として解釈します。

killall(1)マニュアルページ)

答え2

エイリアスには位置パラメータを使用できません。
このエイリアスを使用して実行するコマンドは次のとおりです。

ps ax | grep | cut -f1 -d' ' | xargs kill something

関数で作成する必要があります。

コードよりはるかに長いですが、以下は私が使用している同様の機能です。

smash () {
    local T_PROC=$1
    local T_PIDS=($(pgrep -i "$T_PROC"))
    if [[ "${#T_PIDS[@]}" -ge 1 ]]; then
        echo "Found the following processes:"
        for pid in "${T_PIDS[@]}"; do
            echo "$pid" "$(ps -p "$pid" -o comm= | awk -F'/' '{print $NF}')" | column -t
        done
        if ( yorn.ask "Kill them?" ); then
            for pid in "${T_PIDS[@]}"; do
                echo "Killing ${pid}..."
                ( kill -15 "$pid" ) && continue
                sleep 2
                ( kill -2 "$pid" ) && continue
                sleep 2
                ( kill -1 "$pid" ) && continue
                echo "What the hell is this thing?" >&2 && return 1
            done
        else
            echo "Exiting..."
            return 0
        fi
    else
        echo "No processes found for: $1" >&2 && return 1
    fi
}

yorn.ask私が使用する別の機能は次のとおりです。

yorn.ask () {
    read -p "$@ [Y/n]: " RESP && local YORN_RESP="$(echo "${RESP:0:1}" | grep -i "[YN]")"
    while [[ -z "$YORN_RESP" ]]; do
        echo "Please respond only with: y or n"
        read -p "$@ [Y/n]: " RESP && local YORN_RESP="$(echo "${RESP:0:1}" | grep -i "[YN]")"
    done
    [[ "$YORN_RESP" == 'Y' || "$YORN_RESP" == 'y' ]] && return 0 || return 1
}

関連情報