$!を並列に実行するスクリプトに使用すると、競合状態が発生する可能性がありますか?

$!を並列に実行するスクリプトに使用すると、競合状態が発生する可能性がありますか?

複数のbashスクリプトが並列に実行されていると仮定すると、コードは次のようになります。

#!/bin/bash

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

$!最新のバックグラウンドジョブのPID提供を保証そのスクリプトから、または世界の最新のバックグラウンドタスクですか?返されるPIDが別のスクリプトで開始されたプロセスから来た場合、この機能を使用すると競合状態が発生する可能性があるかどうか疑問に思います。

答え1

$!コマンドを実行するシェルプロセスのpidを提供することを保証しますtail。シェルはシングルスレッドで、各シェルは独自のプロセスに存在し、独自の変数セットを持っています。$!殻は不可能です方法を提供あるシェルにシェル変数を割り当てるのと同じように、別のシェルに割り当てても、別のシェルの同じ名前の変数には影響しません。汎用変数シェルfish)。

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

存在する:

true &
pid=$!

これには$pidシェルが実行されているプロセスのIDが含まれますが、trueそれを使用するときは$pidそのPIDが終了する可能性が高く、他のプロセスを参照できます。

関連情報