2

我正在使用 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 数组中拉出来。

4

1 回答 1

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

回声当然只是为了测试。

对用户的提示,无效索引将终止进程终止似乎是合适的。第二种方法可能是显式终止情况:

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))
于 2012-04-22T16:38:36.600 回答