Javaプログラムをシェルスクリプトから同期実行させたい場合、シェルスクリプトはJavaプロセスが終了するまで待機しなければなりません。この場合でも、trapを使用してシグナルをキャッチし、スクリプトの終了時に適切なクリーンアップを行うことが重要です。
以下にJavaプログラムを同期実行しつつ、trapを使用してクリーンアップ処理を行うシェルスクリプトの例を示します:
program.shの修正版(同期実行)
#!/bin/bash
# trapコマンドを使用してシグナルをキャッチし、クリーンアップ処理を定義
trap 'cleanup' EXIT
# クリーンアップ関数の定義
cleanup() {
echo "クリーンアップ中..."
# プロセスを終了
pkill -P $$
}
# Javaプログラムの同期実行
java -jar your-program.jar
ステートマシンからの呼び出し
ステートマシンから以下のようにシェルスクリプトを呼び出します:
su -l runbat3 -c 'sh /path/to/program.sh'
この方式により、シェルスクリプト内でJavaプログラムが同期実行され、その終了を待つことができます。
詳細説明
- trapコマンドの設定:
trap 'cleanup' EXIT
trap 'cleanup' EXITコマンドは、シェルスクリプトが終了する際にcleanup関数が呼び出されるように設定します。シグナルにはEXITを指定しているため、スクリプトの終了時に必ずcleanup関数が実行されます。
- クリーンアップ関数の定義:
cleanup() {
echo "クリーンアップ中..."
# プロセスを終了
pkill -P $$
}
cleanup関数は、カレントシェルプロセス(およびその子プロセス)をpkill -P $$というコマンドを使って終了します。これにより、シェルスクリプトが終了する際にJavaプロセスも含むすべての子プロセスが終了されます。
- Javaプログラムの同期実行:
java -jar your-program.jar
- このコマンドは、Javaプログラムの同期実行を行います。Javaプロセスが終了するまでシェルスクリプトも待機します。
確認ポイント
- 権限の確認:
上記のスクリプトがrunbat3ユーザーの権限で実行されることを確認し、必要なファイルアクセス権限や実行権限が正しく設定されていることを確認します。 - シグナル伝播:
スクリプトが異常終了やユーザーによる終了(Ctrl+Cなど)で停止された場合に、EXITシグナルが適切にキャッチされ、cleanup関数が実行されることを確認します。
適切にtrapとクリーンアップ処理が設定されていることで、スクリプトが終了する際にJavaプロセスを含むすべての子プロセスが確実に終了されるようになります。これにより、ステートマシンのジョブが停止された場合でも、不要なプロセスがEC2インスタンスに残ることを防ぐことができます。

コメント