2012-06-25 56 views
3

我有以下script1.sh如果通過CTRL + C終止腳本,如何殺死由腳本啓動的Java進程?

#!/bin/bash 

trap 'echo "Exit signal detected..."; kill %1' 0 1 2 3 15 

./script2.sh & #starts a java app 
./script3.sh #starts a different java app 

當我做CTRL + C,它終止script1.sh,但Java Swing應用程序開始通過script2.sh仍保持開放。它怎麼沒有殺死它?

+0

[Bash的?我該如何使一個腳本的子進程被終止,當腳本被終止]的可能重複(http://stackoverflow.com/questions/ 7817637/bash-how-do-i-make-sub-processes-of-a-script-be-terminated-when-the-script-is) – Thilo

+0

另外:http://stackoverflow.com/questions/360201/kill -background-process-when-shell-script-exit – Thilo

+0

我試過了兩個。如果它正在運行,它們都不會殺死真正的Java應用程序... –

回答

0

那麼,如果你在背景模式下啓動腳本(使用&),它是在調用腳本退出後繼續執行的正常行爲。您需要通過將echo $$存儲到文件中來獲取第二個腳本的進程ID。然後讓相應的腳本有一個stop命令,當你調用它時會殺死這個進程。

+1

如果您想捕獲ctrl + c,請使用[trap](http://hacktux.com/bash/control/c) – Miquel

1

我覺得像這樣的東西可以爲你工作。然而,正如@carlspring提到你最好在每個腳本中都有類似的東西,這樣你就可以捕獲相同的中斷並殺死任何丟失的子進程。

採取一切可能

#!/bin/bash 

# Store subproccess PIDS 
PID1="" 
PID2="" 

# Call whenever Ctrl-C is invoked 
exit_signal(){ 
    echo "Sending termination signal to childs" 
    kill -s SIGINT $PID1 $PID2 
    echo "Childs should be terminated now" 
    exit 2 
} 

trap exit_signal SIGINT 

# Start proccess and store its PID, so we can kill it latter 
proccess1 & 
PID1=$! 
proccess2 & 
PID2=$! 

# Keep this process open so we can close it with Ctrl-C 
while true; do 
    sleep 1 
done 
相關問題