Однострочный захват для вывода sudo

332
Illyes Istvan

Фон

У меня есть некоторые корневые процессы, которые я пытаюсь убить, точнее, некоторые tcpdumpпроцессы. Следовательно, мне нужно использовать sudo kill.

Моя текущая команда выглядит примерно так:

sudo kill $(ps aux | grep '[t]cpdump' | awk '' 

Вопрос

Любые идеи по расширению команды (сохраняя ее однострочным) для вывода, как показано ниже, перенаправлены в файл журнала?

  • В случае успеха:

    Успех! Убитые процессы: pid1 pid2 ...

  • В случае неудачи:

    Ошибка! Некоторое сообщение об ошибке.

Простого перенаправления недостаточно, так как команда kill не выводит процессы, которые она уничтожила.

0
Там также pkill, хотя и не уверен насчет регистрации, может использовать pgrep вместо вашего ps | grep | AWK Xen2050 5 лет назад 0
Действительно, команда может быть упрощена с помощью pkill, но я заинтересован в получении результата / результата. Illyes Istvan 5 лет назад 0

2 ответа на вопрос

1
RalfFriedl

Используйте killall.

killall -v tcpdump 

Если вы хотите больше диагностики, проверьте код возврата killall.

Я на самом деле grep-для конкретного выходного файла tcpdump и убивает соответствующий процесс. Я не хочу убивать все процессы tcpdump. Что-то вроде: grep '[t] cpdump_someLabel.pcap' Illyes Istvan 5 лет назад 0
У killall есть опция `-r, --regexp`, она не работает? @IllyesIstvan Xen2050 5 лет назад 0
@ Xen2050 -r будет интерпретировать NAME как расширенное регулярное выражение. Я фильтрую по выходному файлу, а не по имени процесса. Illyes Istvan 5 лет назад 0
@IllyesIstvan Я так и думал, поэтому я ответил, основываясь на полном совпадении командной строки pgrep Xen2050 5 лет назад 0
1
Xen2050

Если killall не работает для вас, и вам нужно соответствовать полной командной строке, всегда есть pgrep -f+ bash + logging (даже технически хранится в одной строке ...)

Сначала несколько строк

if tempkill1=$(pgrep -f "your_pattern") then if kill $tempkill1  then echo Success killed $tempkill1 | tee -a logfile  else echo Error could not kill $tempkill1 | tee -a logfile fi else echo No processes found | tee -a logfile fi 

или вместо если

tempkill1=$(pgrep -f "your_pattern") && { kill $tempkill1 && echo Success \ killed $tempkill1 | tee -a logfile || echo Error could not kill \ $tempkill1 | tee -a logfile; } || echo No processes found | tee -a logfile 

Или вместо всех тройников перенаправьте все stdout:

exec > >(tee -a logfile); tempkill1=$(pgrep -f "your_pattern") && { kill $tempkill1 \ && echo Success killed $tempkill1 || echo Error could not kill $tempkill1; } || \ echo No processes found; exec > /dev/tty 

Конечно, без регистрации, вам нужно только pkill -f, или очень незначительная регистрация успеха / неудачи, например:

pkill -f "your_pattern" && echo Success|tee -a log || echo Error|tee -a log 

Похожие вопросы