シェルスクリプトの `:&`

シェルスクリプトの `:&`

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

関連情報