alias para matar todos os processos de um grep hit [duplicado]

0

Eu estou tentando fazer um alias de superkill que mata todo o processo que acertou um jogo grep. Eu gostaria de fazer:

superkill ruby

E mate todos os processos que correspondam a 'ruby'

No meu .bashrc, adicionei este

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

No entanto, quando eu o executo, recebo

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

Alguém pode me apontar na direção certa?

Obrigado Kevin

atualizar

Isso é diferente da duplicata. Eu estou fazendo uma pergunta específica. A duplicata é uma generalização. É por isso que eu odeio estouro de pilha. Alguns sabem que tudo marca a minha pergunta como um imbecil e eu ainda não tenho uma solução.

ATUALIZE NOVAMENTE

Mais uma vez, a questão "duplicada" é uma questão de alto nível, que fala em generalidades. Não consigo encontrar uma solução depois de ler a duplicata. Os monitores do hall no estouro de pilha são enlouquecedores.

ATUALIZE NOVAMENTE

Estou apenas atualizando para expressar meu desdém por postar sinalizadores e SO em geral. Então nem vou me deixar apagar a postagem. Eu ainda não tenho uma resposta, apenas um monte de gente sabe tudo sobre a minha pergunta "estúpida".

    
por user1130176 13.05.2018 / 00:10

2 respostas

4

O que você está procurando já existe, com o nome killall -r :

killall sends a signal to all processes running any of the specified commands. If no signal name is specified, SIGTERM is sent. [...]

-r, --regexp

Interpret process name pattern as an extended regular expression.

( killall( 1 ) página do manual )

    
por 13.05.2018 / 00:48
3

Você não pode usar parâmetros posicionais com um alias.
O comando que você está executando com esse alias é:

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

Você precisa fazer disso uma função.

Muito mais do que o seu código, mas aqui está uma função semelhante que eu uso:

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 é uma função separada que uso:

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
}
    
por 13.05.2018 / 00:15

Tags