Ethanのシェルスクリプトを理解しようとしています。この投稿、オペレーティングシステムで最大および最小のプロセスIDを取得するために使用されます。
pid=0
for i in {1..100000}; do
: &
if [ $! -lt $pid ]; then
echo "Min pid: $!"
echo "Max pid: $pid"
break
fi
pid=$!
done
私はそれが$
シェルパラメータを置き換えることを知って!
います。範囲「最も最近実行されたバックグラウンド(非同期)コマンド」のPIDを保存します。しかも、&
それ制御演算子コマンドの最後に使用される場合:バックグラウンドプロセスで前に来るすべてを呼び出します。したがって、新しいシェルインスタンスを開き、を実行してから: &
実行すると、次のような結果が$!
得られます。
% : &
[1] <PID>
[1] + done :
% $!
<PID>
各通貨の場所は<PID>
異なります。if [ $! -lt $pid ]; then
効果は何ですか?スクリプトが最小PIDから最大PID(つまり一貫した出力合計100
)に正常に変更されるのはなぜですか99998
?決勝戦は何のためでpid=$!
あるか。カウンタはi
スクリプトでどこに表示されますか(100,000回の繰り返しに加えて)?
答え1
i
オペレーティングシステムの範囲内で可能なすべてのPIDを試すのに十分なプロセスを実行する場合にのみ役立ちます(一部のオペレーティングシステムではより大きなPID範囲を許可します)。これは、起動後に実行されているプロセスの数に応じて、この範囲内のすべてのポイントで開始されます。
: &
何もしないコマンドを実行しますが、一意のPIDが割り当てられます(とにかく起動時に一意です)。
スクリプトは、オペレーティングシステムが番号順にPIDを割り当て、使用中のPIDをスキップしたと仮定します。これは、Linux(デフォルト)を含む動作するUnixファミリーオペレーティングシステムの数です。さらに、スクリプトは、最大プロセスIDが100000未満であると仮定します。これはLinux(15ビットPID)では当てはまりますが、最新のLinuxシステムではそうではありません。
PIDがこれまでに見た最高値より大きい限り、新しい最高値を保存して続行します。
オペレーティングシステムにPIDが不足すると、予約された範囲より高く、現在使用されていない最も低いPIDでループを開始します。
これが最初に発生した場合は、取得したばかりのPIDと終了する前に最高のPIDを報告して完了します。
Linuxはすべてのジョブ制御メッセージ(何千もの)を端末に送信します。最後の行を次に変更してstdout出力全体をリダイレクトしました。
done > /dev/null
そしてstderrに行く2つのエコーを次に変えてください。
printf 1>&2 'Pid range: min %d, max %d\n' $! $pid