background jobとは何か?コマンドを並行して実行する
background jobは、末尾に&を付けて起動されるコマンドで、shellがその終了を待たず、その間に他のコマンドを実行できるようにします。
テストを実行する前にサーバーを起動する場合など、別のことをしている間もコマンドを実行し続けたいことがあります。コマンドに&を追加すると、shellはそれをバックグラウンドで起動して先に進みます。CIではこれは便利ですがリスクもあります。background jobを正しく待たないと、その失敗を見逃す可能性があります。
background jobとは何か
コマンドに&を追加すると、shellに対して、終了までブロックするのではなく、それを起動してすぐにpromptに戻るよう指示します。jobは別のprocessとして実行され続けます。
フォアグラウンドとバックグラウンド
フォアグラウンドのコマンドは終了するまでshellを保持します。バックグラウンドのコマンドはすぐにshellを解放するため、それが動作している間に他のコマンドを実行できます。shellはbackground jobを追跡し、それぞれにjob番号を与えます。
background jobの管理
jobsは現在のbackground jobを一覧表示します。waitはbackground jobが終了するまでブロックします。$!は最も新しいbackground jobのprocess IDを保持します。
exit codeの落とし穴
shellがそれを待たなかったため、background jobの失敗は自動的にはスクリプトを失敗させません。jobをwaitしてexit codeを確認する必要があり、そうしないとクラッシュしたバックグラウンドサーバーが見過ごされる可能性があります。
CIにおけるbackground job
よくあるパターンは、バックグラウンドでサーバーを起動し、テストを実行し、その後停止することです。落とし穴は、waitを忘れることや、サーバーが実際に起動したかを確認し忘れることで、これがテストが何もない相手に対して実行される紛らわしい失敗につながります。
マネージドrunnerでの信頼できる並行処理
Latchkeyのrunnerでは、バックグラウンドサーバーはjobの間だけ存在します。テスト前にreadiness checkをpollingし、最後にjobをwaitすることで、クラッシュしたバックグラウンドprocessが本物の失敗として現れます。
重要なポイント
- background jobは&を付けて実行され、shellは待たずに続行します。
waitと$!を使ってbackground jobの結果を追跡・確認します。- CIでは常にbackground jobを待って確認しないと、失敗がすり抜けます。