プロセスが終了しない理由と終了する方法

プロセスが終了しない理由と終了する方法

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を追跡します。

関連情報