2017-06-29 26 views
0

Javaアプリケーションを実行し、フォアグラウンドを実行しているスクリプトがあります。 私が達成したいのは、Ctrl + cを押したときにJavaアプリケーションを閉じることです。JavaアプリケーションのプロセスツリーをCtrl + CでBashスクリプトから実行する

このようにすると仮定何か:

のbash-FILE-1:

trap "stopit; exit" SIGINT 
echo "Going to run java app" 
source bash-file-2.sh 

bash-file-2.sh:

exec java -jar myapp.jar 
  • stopit()関数は単に見えに.pidファイルの場合、プロセスが終了します。バックグラウンドでアプリを実行するとうまく動作します。

私はCtrl + cを押してもコンソールモードを終了しますが、アプリケーションはバックグラウンドで動作し続けます。これは、アプリケーションが 'exec'コマンドのために別のシェルで実行されているためです。これは正しいです?

この場合、ctrl + cをトラップしてstopit関数を呼び出すにはどうすればよいですか?私が実行しています

EDIT

のJavaアプリは、実際のjarファイルを呼び出すラッパージャーです。

それはこのようなものになるだろう:

bash1 -> bash2 -> wrapper.jar -> myapp.jar 
+0

'exec'は他とあなたのプロセスを置き換えます'stopit'はそのプロセスにはもう存在しませんが、' exec'が本当に必要なわけではありません。あなたは 'java ... 'を持つことができ、入力したようにそのコマンドを実行します。 –

+0

@EricRenouf私は質問を編集した、私はあなたは言った、問題は別の瓶を呼び出す瓶から来ていることに気づいた。それは可能でしょうか? –

+0

呼び出しはどのように起きていますか、私は2番目のjarを意味します – Marged

答えて

0

(Javaアプリケーション)あなたの子プロセスが新しいプロセスを生成した場合、アプリをルートと完全なプロセスツリーを殺すために必要があります。

まず、(一般的な)ヘルパーkilltree機能定義:あなたのtrapに、言う、その後

#!/bin/bash 

# Prints all descendant of a process `ppid`, level-wise, bottom-up. 
# Usage: _get_proc_descendants ppid 
function _get_proc_descendants() { 
    local pid ppid="$1" 
    local children=$(ps hopid --ppid "$ppid") 
    for pid in $children; do 
     echo "$pid" 
     _get_proc_descendants "$pid" 
    done 
} 

# Kills all process trees rooted at each of the `pid`s given, 
# along with all of their ancestors. 
# Usage: killtree [pid1 pid2 ...] 
function killtree() { 
    while [ "$#" -gt 0 ]; do 
     local pids=("$1" $(_get_proc_descendants "$1")) 
     kill -TERM "${pids[@]}" &>/dev/null 
     shift 
    done 
} 

を:

$java_app_pidはあなたのJavaアプリのPID(ある
trap "killtree $java_app_pid; exit" SIGINT 

あなたが言いましたあなたはpidファイルにあります)。あなたのtrap(スクリプトの子供を殺す)

function killtree() { 
    while [ "$#" -gt 0 ]; do 
     local pids=($(_get_proc_descendants "$1")) 
     kill -TERM "${pids[@]}" &>/dev/null 
     shift 
    done 
} 

および簡素化:

あるいは、PIDの子孫のみを殺すためにkilltreeを定義することができ

trap "killtree $$; exit" SIGINT 
関連する問題