1 つの HTTP ポートで実行するサーバーと、別のポートで (一時的に) 実行される別のスクリプトがあります。
パイプを使用して同時に実行できるようにし、角かっこを使用してコマンドをグループ化してスリープが最初に発生するようにしました(2番目のスクリプトは最初のスクリプトで開始されたサーバーにアクセスするため、最初のスクリプトを設定するのに時間がかかります)。
正常に動作し、サーバーが起動してスリープ状態になった後、テストファイルは正しく実行されますが、スクリプトが実行されたばかりのように、テスト後にターミナルプロセスが自動的に終了しません。
npm run start-json-server | { sleep 1; node './test/index-cjs.js' ; }
自然なシャットダウンを許可するには(できればプロセスを見つけて終了する手間をかけずに)、どうすればよいですか?
修正する:サーバーである最初のスクリプトが終了しないため、まだ実行中であることを知っています。しかし、PIDを見つけずに再び終了する方法はありますか?
答え1
パイプは同時プロセスを開始するために使用されません。これを行うには、主にパイプラインの2つのステップ間でデータフローを設定するために使用されます。
パイプの代わりに
npm run start-json-server &
server_pid="$!"
sleep 1
node ./test/index-cjs.js
kill "$server_pid"
これにより、バックグラウンドで最初のコマンドが開始されます。その後、2番目のコマンドが開始される前に1秒の遅延があります。 2番目のコマンドが完了すると、1番目のコマンドが終了します。
最後に開始されたバックグラウンドプロセスのPID(&
最後に開始されたプロセスを使用)を使用できます"$!"
。ここでは、その事実を使用して最初のコマンドのPIDを追跡します。