web-dev-qa-db-ja.com

$できます!並列実行されているスクリプトで使用すると競合状態が発生しますか?

次のようなコードで、並行して実行される複数のbashスクリプトがあるとします。

#!/bin/bash

tail -f /dev/null &
echo "pid is "$!

$!最新のバックグラウンドタスクのPIDを提供することが保証されていますそのスクリプト内、またはそれはグローバルに最新のバックグラウンドタスクですか?この機能に依存すると、別のスクリプトで開始されたプロセスからのPIDが返されたときに競合状態が発生するのではないかと気になるところです。

8
philraj

$!は、シェルがそのtailコマンドを実行したプロセスのPIDを提供することが保証されています。シェルはシングルスレッドであり、各シェルは独自の変数セットを持つ独自のプロセス内に存在します。方法はありません$!あるシェルのleakを別のシェルに入れます。あるシェルでシェル変数を割り当てても、別のシェルの同じ名前の変数には影響しません(- ユニバーサル変数fishシェルの)。

さて、tail -f /dev/nullは無期限に実行されるコマンドですが、有効期間が短いコマンドの場合、可能なプロセスIDの数は限られているため、プロセスIDは必然的に再利用されます。

に:

true &
pid=$!

それ $pidには、シェルが実行されたプロセスのID _trueが含まれますが、使用するときには$pid、そのpidは死んでいる可能性があり、別のプロセスを参照している可能性があります。

16