Перейти к содержимому

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

0

Фон

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

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

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

Вопрос

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

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

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

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

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

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

486 просмотров
Illyes Istvan спросил 7 лет назад
I 175

2 ответа

1

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

killall -v tcpdump 

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

Я на самом деле grep-для конкретного выходного файла tcpdump и убивает соответствующий процесс. Я не хочу убивать все процессы tcpdump. Что-то вроде: grep '[t] cpdump_someLabel.pcap'

Illyes Istvan · 7 лет назад · 0

У killall есть опция -r, --regexp, она не работает? @IllyesIstvan

Xen2050 · 7 лет назад · 0

@ Xen2050 -r будет интерпретировать NAME как расширенное регулярное выражение. Я фильтрую по выходному файлу, а не по имени процесса.

Illyes Istvan · 7 лет назад · 0

@IllyesIstvan Я так и думал, поэтому я ответил, основываясь на полном совпадении командной строки pgrep

Xen2050 · 7 лет назад · 0
RalfFriedl ответил 7 лет назад
R 1 015
1

Если 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 
Xen2050 ответил 7 лет назад
X 9 699