2

bash で複数のダイアログ画面を使用してスクリプトを作成しています。スクリプトの機能の 1 つは、特定のプロセスを強制終了する必要があります。すべての PID 値を pid という 1 つの配列にロードします。

pid = ('1234' '1233' '1232' '1231' '1230')

次に、プロセスのリストを含むダイアログ チェックリストをユーザーに提示します。それらのいくつかを選択すると、ダイアログはチェックリストのエントリ番号 (0、2、4 など) を返します。

私の最初の計画は、選択したエントリを 2 番目の配列に保存し、それを使用して最初の配列から特定の 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

もちろん、エコーはテスト用です。

無効なインデックスがプロセスの強制終了を終了させるというユーザーへのヒントは適切と思われます。2 番目のアプローチは、明示的な終了の場合です。

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 に答える