質問する
3399 次
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 に答える