4
4

3 に答える 3

3

移植性と信頼性を最大限に高めるには、 -A(の POSIX シノニム-e) とカスタム形式を-oではなくと共に使用し-fます。

の出力のフィルタリングpsは脆弱です。他のプロセスと一致する可能性があります。grep プロセスを除外する必要があり、スクリプトも除外する必要がある場合があります。コマンドライン$processに部分文字列が含まれているため、他の完全に無害なプロセス (スクリプト自体など) が争いに巻き込まれている可能性があります。 . フィルタリングをできるだけ厳密にします。を使用ps -o pid= -o comm=すると、ヘッダーのない 2 つの列 (引数なしの PID とコマンド) のみが得られます。

殺害を行うためにループを使用する必要はなく、kill複数の引数を受け入れます。カウントについては、シェルに任せてください。空白で区切られた数字のリストがあり、シェルに単語分割($(…)外側の引用符を使用)を実行させ、結果の単語の数をカウントさせます($#)。

count_and_kill_processes () {
  set -- $(ps -A -o pid= -o comm= |
           awk -v "name=$process" '$2 == name {print $1}')
  count=$#
  if [ $# -ne 0 ]; then kill "$@"; fi
}
count_and_kill_processes foo
# now the number of killed processes is in $count

シェルがすべてのマシンで bash または ksh の場合、配列を使用できます。

pids=($(ps -A -o pid= -o comm= |
           awk -v "name=$process" '$2 == name {print $1}') )
if [[ $# -ne 0 ]]; then kill "$@"; fi
# the number of killed processes is ${#pids}
于 2012-09-02T13:05:48.657 に答える
1

どちらの場合でも機能するループを使用できます。

for pid in $(ps -ef | grep -v grep | grep $process | awk '{print $2}'); do
  echo $pid
done

または一致の数を数えます:

if [ $(ps -ef | grep -v grep | grep $process | awk '{print $2}' | wc -l) -gt 1 ]
then
  # more than one
fi
于 2012-09-02T11:11:21.117 に答える