псевдоним для уничтожения всех процессов попадания 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, это работает. То, что я ищу, это то, что псевдонимы убивают -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 в любом варианте не работает, насколько я могу судить.

То, что вы ищете, уже существует, под именем killall -r :

killall отправляет сигнал всем процессам, выполняющим любую из указанных команд. Если имя сигнала не указано, отправляется SIGTERM . […]

-r, –regexp

Интерпретировать шаблон имени процесса как расширенное регулярное выражение.

( killall( 1 ) страница справочника )

Вы не можете использовать позиционные параметры с псевдонимом.
Команда, которую вы запускаете с этим псевдонимом:

 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 }