Shell脚本查找ssh的PID并杀死PID(如果存在)

时间:2013-12-24 12:50:12

标签: bash shell awk

我正在尝试编写一个脚本来查找反向SSH PID,如果存在则将其终止。因为它给出错误,我被困在“awk”上。下面是剧本:

a=('ps -aef | grep "ssh -fN" | grep -v grep | awk '{ print $2 }'')

if [ -n "$a" ]

then

    echo "String \"$a\" is not null."
    kill -9 "$a" 

fi

我注释掉了,然后,杀死和fi行来调试脚本。我收到以下错误:

String "ps -aef | grep "ssh -fN" | grep -v grep | awk {" is not null.

我相信awk的括号正在创建问题,我无法为此找到解决方法。在命令行上,这完美地工作并返回正确的PID。

ps -aef | grep "ssh -fN" | grep -v grep | (awk '{ print $2 }'

将PID传递给变量“a”后,我需要发出kill命令。操作系统是Centos 6.4

P.S:我不会说流利的脚本,但试图实现目标。帮助将受到高度赞赏!

2 个答案:

答案 0 :(得分:1)

您的脚本存在多个问题。

  • 您需要使用命令替换将ps管道的输出存储到数组中。
  • 您需要检查数组中的元素数量。
  • 请参阅数组而不是变量

以下内容可能适合您:

pids=( $(ps -ef | grep '[s]sh -fN' | awk '{print $2}') )
if [ "${#pids[@]}" -gt 0 ]; then
  kill -9 "${pids[@]}";
fi

答案 1 :(得分:0)

首先,如果你有grep然后awk,你可以摆脱这些油脂:

ps -aef | grep "ssh -fN" | grep -v grep | awk '{ print $2 }'

ps -aef |awk  ' { if ( ($0 ~ /ssh -FN/) &&  (! $0 ~ /grep/) ) { print $2 } }' 

但是,请使用pgrep

,而不是使用ps
pgrep -f "ssh -[fN][fN]"  # Will match against either 'ssh -fN' or 'ssh -Nf'

甚至有一个pkill会为你完成整个命令:

pkill -f "ssh -[fN][fN]"

这将找到与该特定字符串匹配的所有进程并将其终止(如果它们存在)。