用于终止 grep 命中的所有进程的别名

用于终止 grep 命中的所有进程的别名

我正在尝试创建一个 superkill 别名来杀死所有匹配 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,这确实有效。我正在寻找的是别名kill -9 来匹配grep 的东西。

更新 - 这让我想起了我对 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
}

相关内容