Function 将变量传递到使用awk的函数中
我有一个脚本,它试图按名称停止某个进程(但我需要指定一个不能终止的字符串,即“notThisProcess”),然后在20秒后终止它,如果它没有正常运行,即:Function 将变量传递到使用awk的函数中,function,variables,awk,parameter-passing,aix,Function,Variables,Awk,Parameter Passing,Aix,我有一个脚本,它试图按名称停止某个进程(但我需要指定一个不能终止的字符串,即“notThisProcess”),然后在20秒后终止它,如果它没有正常运行,即: #!/bin/ksh bname=BTEST bserver=BSERVER PROCESS_ID=`ps auxww | awk '/PROCESS_NAME_ALPHA/ && !/awk/ && !/notThisProcess/ {print $2}'` /apps/customapp/stopc
#!/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分配的文章,但是尽管有几次尝试,我还是没有成功。有什么建议吗?您可以在管道字符分隔列表中传递建议,并与最后一个字段进行比较
ps ... | awk -v keep="process1|process2|process3" '$NF!~keep{print $2}'
还请注意,在脚本
awk'/$1/&&&…
中,变量不是bash变量,而是传递给awk
脚本的第一个字段。您可以在管道字符分隔列表中传递它们,并与最后一个字段进行比较
ps ... | awk -v keep="process1|process2|process3" '$NF!~keep{print $2}'
还要注意的是,在脚本
awk'/$1/&&…
中,变量不是bash变量,而是传递给awk
脚本的第一个字段。我会这样写:
#!/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 box的权限ps auxww
output on my Linux box在字段11中显示命令名,因此不是/name/&&/awk/&/此脚本/
您可能可以使用$11==name{print$2}
,
或者
$11~name
如果匹配不准确。我会这样写:
#!/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 box的权限ps auxww
output on my Linux box在字段11中显示命令名,因此不是/name/&&/awk/&/此脚本/
您可能可以使用$11==name{print$2}
,
或者
$11~name
如果匹配不准确。如其他人所述,可以使用选项-v将shell变量传递给awk脚本。如果awk脚本驻留在单独的文件中(通过使用选项-f),则必须使用此选项
在单引号(“…”)之间直接在shell脚本中指定awk脚本时,还可以使用构造“$shell_变量””。请注意,执行此操作时,单引号和双引号之间不得有空格
例如:
process_string="plugin-container"
pids=$( ps -fu $LOGNAME | awk '/'"$process_string"'/ { print $2 }' )
正如其他人已经指出的,可以使用选项-v将shell变量传递给awk脚本。如果awk脚本驻留在单独的文件中(通过使用选项-f),则必须使用此选项 在单引号(“…”)之间直接在shell脚本中指定awk脚本时,还可以使用构造“$shell_变量””。请注意,执行此操作时,单引号和双引号之间不得有空格 例如:
process_string="plugin-container"
pids=$( ps -fu $LOGNAME | awk '/'"$process_string"'/ { print $2 }' )
美丽的!非常感谢,效果很好。第22行有一个小小的错误,你就有一个额外的}。奇怪的是,它只影响进程列表中的最后一个进程。感谢您提供的优雅解决方案!谢谢,打字错误修正了。在右大括号之后,额外的大括号只是一个常规字符:
a=(1234);echo“${a[@]}”
漂亮!非常感谢,效果很好。第22行有一个小小的错误,你就有一个额外的}。奇怪的是,它只影响进程列表中的最后一个进程。感谢您提供的优雅解决方案!谢谢,打字错误修正了。在右大括号之后,额外的大括号只是一个常规字符:a=(1234);回显“${a[@]}”