我有一个脚本尝试按名称停止某个进程(但是我需要指定一个不能被杀死的字符串,即“notThisProcess”),如果它还没有来,则在20秒后杀掉它优雅地说,即:
#!/bin/ksh
bname=BTEST
bserver=BSERVER
PROCESS_ID=`ps auxww | awk '/PROCESS_NAME_ALPHA/ && !/awk/ && !/notThisProcess/ {print $2}'`
/apps/customapp/stopcommand -a $bname -processName PROCESS_NAME_ALPHA -serverName $bserver
sleep 20
kill -4 $PROCESS_ID
PROCESS_ID2=`ps auxww | awk '/PROCESS_NAME_BETA/ && !/awk/ && !/notThisProcess/ {print $2}'`
/apps/customapp/stopcommand -a $bname -processName PROCESS_NAME_BETA -serverName $bserver
sleep 20
kill -4 $PROCESS_ID2
#etc..
由于我的进程列表刚刚增加,我试图将这些步骤放入函数中,但我无法弄清楚如何将进程名称传递给awk。即,这不起作用:
#!/bin/ksh
bname=BTEST
bserver=BSERVER
cycleProcess()
{
PROCESS_ID=`ps auxww | awk '/$1/ && !/awk/ && !/notThisProcess/ {print $2}'`
/apps/customapp/stopcommand -a $bname -processName PROCESS_NAME_ALPHA -serverName $bserver
sleep 20
kill -4 $PROCESS_ID
}
cycleProcess PROCESS_NAME_ALPHA
cycleProcess PROCESS_NAME_BETA
exit
我已经看过几次通过-v引用赋值,但尽管经过多次尝试但我还没有成功。有什么建议吗?
答案 0 :(得分:0)
您可以在管道字符分隔列表中传递它们,并与最后一个字段进行比较。
ps ... | awk -v keep="process1|process2|process3" '$NF!~keep{print $2}'
另请注意,在您的脚本awk '/$1/ && ...
中,变量不是bash变量,而是传递给awk
脚本的第一个字段。
答案 1 :(得分:0)
我这样写:
#!/bin/ksh
bname=BTEST
bserver=BSERVER
cycleProcess() {
typeset procname="$1"
typeset pid=$(ps auxww | awk -v name="$procname" '$0 ~ name && !/awk/ && !/notThisProcess/ {print $2}')
if [[ -z "$pid" ]]; then
echo "$procname is not running"
return
fi
/apps/customapp/stopcommand -a "$bname" -processName "$procname" -serverName "$bserver"
sleep 20
kill -4 "$pid"
}
processes=(
PROCESS_NAME_ALPHA
PROCESS_NAME_BETA
)
for proc in "${processes[@]}"; do
cycleProcess "$proc"
done
函数中的 typeset
是一种将变量声明为该函数的本地变量的方法。
我无法访问AIX框。我的Linux框上的ps auxww
输出显示字段11中的命令名称,因此您可以使用/name/ && !/awk/ && !/thisScript/
而不是$11 == name {print $2}
,
如果匹配不准确,则为$11 ~ name
。
答案 2 :(得分:0)
正如其他人已经指出的那样,可以使用 -v 选项将shell变量传递给awk脚本。如果awk脚本位于单独的文件中(使用 -f 选项),则必须使用此选项。
在shell脚本中直接在单引号(' ...')之间指定awk脚本时,您也可以使用构造' " $ shell_variable " ' 即可。请注意,这样做时,单引号和双引号之间必须没有空格!
示例:
process_string="plugin-container"
pids=$( ps -fu $LOGNAME | awk '/'"$process_string"'/ { print $2 }' )