单行捕获 sudo kill 的输出

单行捕获 sudo kill 的输出

背景

我有一些想要终止的 root 进程,更确切地说是一些tcpdump进程。因此,我需要使用sudo kill

我当前的命令如下所示:

sudo kill $(ps aux | grep '[t]cpdump' | awk '{print $2}'

问题

有什么想法可以扩展命令(保持其为一行)以便将如下所示的输出重定向到日志文件?

  • 如果成功:

    成功!已终止进程:pid1 pid2...

  • 如果发生故障:

    错误!一些错误信息。

简单的重定向是不够的,因为 kill 命令不会输出它杀死的进程。

答案1

如果 killall 对你不起作用,而你需要匹配完整的命令行,那么总是pgrep -f+ bash + 日志记录,(甚至技术上保持在一行上...)

首先几行

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

或者代替 if

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

或者,重定向所有 tee,而不是所有的 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

答案2

使用killall

killall -v tcpdump

如果您需要更多诊断,请检查的返回代码killall

相关内容