環境
Windows Server 2012R2
PowerShell 4.0
背景
Javaプロセスの停止が途中でハングし後続ジョブに進めないことに備え、スクリプトでプロセス停止後に強制停止を仕込むことがあります。
Windowsで同一OS内にJavaプロセスが複数存在する場合、名前(java.exe)指定でtaskkillすると全てのJavaプロセスを落としてしまいます。
特定のJavaプロセスを停止させたい場合はプロセスID(PID)で識別しますが、ここではPIDファイルを利用した強制停止を試しています。
Java強制停止のコマンドレット
Java停止コマンドの実行後に、下記を追加します。
# PIDファイルパス -IBM WASでの例-
$pid_file = "${install_root}/profiles/${profile_name}/logs/${server_name}/${server_name}.pid"
if(test-path $pid_file){
# プロセスがまだ残っていたらkillしてpidファイルも削除
write-output "Kill process:${server_name}"
$pid = get-content $pid_file
stop-process $pid -force
remove-item $pid_file
}else{
# プロセスが既に正常停止していたら何もしない
write-output "process:${server_name} was already stopped:"
}
JavaのPIDファイルは、製品によって出力場所も異なりますのでご注意ください。
IBM WASベースの製品では、PIDファイルはJavaプロセス起動時に生成され、停止時に削除される仕様のため、次回起動時に影響しないよう、強制停止時にもPIDファイルも削除しておきます。
参考
http://qiita.com/opengl-8080/items/bb0f5e4f1c7ce045cc57
http://labunix.hateblo.jp/entry/20121108/1352378556
https://www.ibm.com/developerworks/community/forums/html/topic?id=77777777-0000-0000-0000-000014801453#77777777-0000-0000-0000-000014810269