Linux bashはバックグラウンドプロセスの集約を防ぎます。

Linux bashはバックグラウンドプロセスの集約を防ぎます。

私のスクリプトは束を作ります。これにより、2回実行するのを防ぎます。スクリプトが別のスクリプトを実行できるため、問題が発生します。時には、他のスクリプトがプロセスをバックグラウンドに残すことがあります。残念ながら、彼らは私に不要な群れを受け継いだ。指定された実行可能ファイルを実行する前にいくつかのファイルハンドルを閉じるラッパーはありますか?

私はLinux Debianを使用していますが、重要なLinuxディストリビューションやバージョンではありません。

詳細なシナリオ:

  1. 私のスクリプトAが実行されました。
  2. 私のスクリプトAは人々を私に集めます。
  3. 私のスクリプトAは外部実行可能ファイルBを実行します。
  4. 外部Bは実行可能ファイルCをバックグラウンドで実行します(無理継承)。
  5. 外部Bは完了し、Cはバックグラウンドに残ります(群を継承します)。
  6. Bが完了したので、私のスクリプトAは完了です。
  7. 別のループ、私のスクリプトAが実行されます(ポイント1のように)。
  8. Cがまだ実行中であるため、私のスクリプトAのためにクラスタが失敗します。

閉じた集約ファイルハンドルを使用して外部実行可能ファイルBを正しく実行したいと思います。 Flockは、私のスクリプトAだけが実行されるまで維持する必要があります。私は「群れ穴」があるので、2時から3時の間にきつい群れが欲しくありません。これに似たパッケージオペレーティングシステムはありますか?

答え1

~によると群れのマニュアルページ、これは-uまたは--unlockオプションを使用します。

-u, --ロック解除

ロックを下げてください。ファイルを閉じるとロックは自動的に削除されるため、通常これは必要ありません。しかし、特別な場合には必要な場合があります。たとえば、閉じたコマンドグループがロックを維持してはならないバックグラウンドプロセスを分岐した可能性があります。

したがって、規定された技術は次のようになります。

(
    flock 200 | exit 99
    # some commands that should be guarded by the lock
    # some of them fork daemons that keep our lock file open
    flock --unlock 200 # we're done with the lock, we can release it
) 200>/path/to/lock-file

答え2

次のコードはロックを取得し、trapスクリプトの終了時にロックを解放します。子プロセスはロックを継承しますが、flock --unlock 200実行後はそれを保持しません。

flock 200 | exit 1
trap "flock --unlock 200" EXIT
# The rest of the script...

注:trap一度に1つのみ有効です。出口トラップで複数のコマンドを実行する必要がある場合は、そのコマンドをメソッドに入れるか結合する必要がありますtrap "flock --unlock 200; echo Bye" EXIT

答え3

昨日の梱包について書いた。不要なハンドルをすべて閉じてから、指定されたコマンドを呼び出します。残念ながら、ハンドルの種類を確認せずに、既知のハンドル以外のすべてのハンドルを閉じます。

<==== file: wrapper.sh ====>
#!/bin/bash
for fd in $(ls /proc/$$/fd); do
 case "$fd" in
  0|1|2|255)
 ;;
 *)
  eval "exec $fd>&-"
 ;;
 esac
done
exec $1 $2 $3 $4 $5 $6 $7 $8 $9

次のように計算します。

wrapper.sh some_command command parameters

このデフォーマーが使えます。ステップ3私の通貨シナリオで。その後、群れは基本スクリプトにのみ存在し、ラッパーは呼び出されたスクリプトとそのサブスクリプトから継承を中止します。

関連情報