2

多くのジェンキンス プロジェクトを並行して実行しています。私たちは python を使用しており、仮想環境を pyenv で管理することを選択しました。残念ながら、pyenv にはよく知られた競合状態があります。この問題を回避するために、プロセス レベルでロックを実装したいと考えています。私がやりたいことは次のとおりです。

lock some resource (a file?)
do my pyenv stuff
unlock the resource

私のスクリプトは bash で書かれています。bashでリソースのロック/ロック解除を実装するにはどうすればよいですか?

4

2 に答える 2

3

したがって、UNIX の世界でクロスプロセス ロックが必要な場合の友は、 と呼ばれるコマンドflockです。これは OS レベルでのアトミック操作として実装されており、この種の作業に非常に役立ちます。詳細については、こちらをご覧ください。使用方法は次のとおりです。

  # Wait for lock on  (fd 222) for 10 seconds
  (flock -w 10 222 || exit 1

  {
      # Do the operations you want to here
  }) 222>/path/to/lockfile 

ここにはいくつかのトリックがあります。まず、通常、出力リダイレクトを使用する場合、bash は群れを試みる前にファイルを開きます。ただし、ここでは、()bash が最初のコマンドが flock であるサブシェルを最初に開始するためです。flock は、ファイル ハンドル 222 でロックを取得しようとします。次に、flock はファイル記述子をロックします。ファイル記述子をロックした後、 のコード{}が実行されます。それが実行された後、ファイル記述子222の内容がロックファイルに書き込まれ(すなわち何もない)、ファイルが閉じられ、ロックが解放される。これは、ファイルを閉じるとロックが解除される C に似ています。もちろん、ここで何が起こっているのかを説明している著名な @CharlesDuffy (帽子のヒント @codeforester) よりも優れた説明はありません。

于 2016-12-22T05:01:00.283 に答える