次のようなコードで、並行して実行される複数のbashスクリプトがあるとします。
#!/bin/bash
tail -f /dev/null &
echo "pid is "$!
は$!
最新のバックグラウンドタスクのPIDを提供することが保証されていますそのスクリプト内、またはそれはグローバルに最新のバックグラウンドタスクですか?この機能に依存すると、別のスクリプトで開始されたプロセスからのPIDが返されたときに競合状態が発生するのではないかと気になるところです。
$!
は、シェルがそのtail
コマンドを実行したプロセスのPIDを提供することが保証されています。シェルはシングルスレッドであり、各シェルは独自の変数セットを持つ独自のプロセス内に存在します。方法はありません$!
あるシェルのleakを別のシェルに入れます。あるシェルでシェル変数を割り当てても、別のシェルの同じ名前の変数には影響しません(- ユニバーサル変数fish
シェルの)。
さて、tail -f /dev/null
は無期限に実行されるコマンドですが、有効期間が短いコマンドの場合、可能なプロセスIDの数は限られているため、プロセスIDは必然的に再利用されます。
に:
true &
pid=$!
それ $pid
には、シェルが実行されたプロセスのID _true
が含まれますが、使用するときには$pid
、そのpidは死んでいる可能性があり、別のプロセスを参照している可能性があります。