我正在使用bash中的多个对话框屏幕编写脚本。脚本的一个功能应该是杀死特定进程。我将所有PID值加载到一个名为pid的数组中:
pid = ('1234' '1233' '1232' '1231' '1230')
然后我向用户显示一个包含进程列表的对话框清单。 在他们选择其中一些对话框后,返回清单条目编号,例如0,2,4。
我的初步计划是将所选条目存储在第二个数组中,然后使用它从第一个数组中获取特定的PID,但到目前为止,我尝试过的任何工作都没有,在这种情况下将是:1234,1232 ,1230。所以我可以杀死那些特定的过程。
有没有人有更好的解决方案?我希望根据用户在对话框清单中所做的选择,最简单的方法来终止进程。
这是有问题的功能:
stop_tunnel() {
local tunnels
local pid
declare -a tunnels
declare -a pid
#this is executed on a remote system in the real script
ps aux | grep -w ssh > $_temp
awk -F "ssh" '{print "ssh" $2}' $_temp > $_temp1
awk '{print $2}' $_temp > $_temp2
IFS='
'
tunnels=( $( < $_temp1 ) )
pid=( $( < $_temp2 ) )
dialog --checklist "Select tunnel to stop:" 10 72 0 \
0 "${tunnels[0]}" off \
1 "${tunnels[1]}" off \
2 "${tunnels[2]}" off \
3 "${tunnels[3]}" off \
4 "${tunnels[4]}" off \
2>$_temp
nr=$( < $_temp )
dialog --title " Tunnel stop " --msgbox "\nYou stopped these tunnels: ${nr[@]}" 6 44
}
nr数组包含用户选择。我想用它来将特定成员从pid数组中拉出来。
答案 0 :(得分:2)
选择可能就是您所需要的:
select p in ${pid[@]} ; do echo "kill" $p && break; done
请注意,作业周围的空白不起作用:
# wrong:
pid = ('1234' '1233' '1232' '1231' '1230')
# right:
pid=('1234' '1233' '1232' '1231' '1230')
允许按顺序终止多个进程:
select p in ${pid[@]} ; do
if [[ -n $p ]]
then echo "kill" $p
else break
fi
done
1) 1234
2) 1233
3) 1232
4) 1231
5) 1230
#? 3
kill 1232
#? 4
kill 1231
#? 6
echo 当然只是用于测试。
对用户的提示,无效索引将终止进程终止似乎是合适的。第二种方法可能是明确的终止案例:
pid=('1234' '1233' '1232' '1231' '1230' 'terminate')
你将处理休息。
如果你只想迭代选择,那么:
sel=(0 2 4)
for n in ${sel[@]} ; do echo kill ${pid[$n]}; done
我没有安装对话框,但我猜zenity
类似。在那里你捕获列表选择的输出:
selection=($(zenity --list --text "kill something" --multiple --column "kill" --separator " " --checklist --column ps TRUE foo FALSE bar FALSE baz TRUE fozboa))