Как убить процесс с помощью awk?

В моем makefile у меня есть команда

kill `ps aux | awk '/process_name/' | awk '$11 ~ /special_mask/ {print $2}'`

Через терминал работает, но при попытке вызвать через команду make my-command возвращает

kill `ps aux | awk '/process_name/' | awk '1 ~ /special_mask/ {print }'`

и он не может выполнить kill без идентификатора процесса. Как я могу это исправить?


person Jens    schedule 11.09.2017    source источник
comment
Вы можете использовать: ps aux | awk '/[p]rocess_name/ && $11 ~ /special_mask/{print $2}' | xargs kill   -  person anubhava    schedule 11.09.2017
comment
@anubhava это не помогает. может быть, есть способ проверить, что select возвращает не пустую строку?   -  person Jens    schedule 11.09.2017
comment
@Jens: используйте флаг -r в xargs (GNU не относится к POSIX), что означает, что только если команды перед конвейером создают выходную строку (stdout), команда после xargs запускается (kill в вашем случае ). .. | xargs -r kill. Таким образом, если процесс не найден, в консоли не видно ошибок (команда kill не выполняется)   -  person Inian    schedule 11.09.2017
comment
@Inian Спасибо за ваш ответ. С -r ошибки нет, но команда все равно возвращает ...&& 1 ~ /php/{print }'... Теряет $11 и $2.   -  person Jens    schedule 11.09.2017
comment
Помните, что 1 — это не то же самое, что $1 в Awk.   -  person Inian    schedule 11.09.2017
comment
@anubhava Да, я   -  person Jens    schedule 11.09.2017
comment
@anubhava В моем Makefile у меня есть следующие строки my-command: ps aux | awk '/[s]ocket-ws.php/ && $11 ~ /php/{print $2}' | xargs -r kill. Так что я мог бы вызвать эту команду, используя make my-command   -  person Jens    schedule 11.09.2017
comment
О, Makefile нуждается в двойном $$, используйте: ps aux | awk '/[p]rocess_name/ && $$11 ~ /special_mask/{print $$2}' | xargs -r kill   -  person anubhava    schedule 11.09.2017
comment
@anubhava Ничего себе, никогда не знал об этом. Большое спасибо. Напишите это как ответ, и я подтвержу это   -  person Jens    schedule 11.09.2017


Ответы (1)


Makefile требует двойного $$ для команд оболочки.

Ты можешь использовать:

ps aux | awk '/[p]rocess_name/ && $$11 ~ /special_mask/{print $$2}' | xargs -r kill
person anubhava    schedule 11.09.2017