2016-04-15 16 views
2

inturnがnohupを使用して他のschellスクリプトを呼び出すシェルスクリプトを作成しました。スクリプトが正常に終了した後も、私が書いたカスタムスクリプトのためにLinuxプロセスが実行されています。予想通りstartAllComponents.sh実行成功後のシェルスクリプトの終了処理

start_Server() 
{ 
SERVER_HOME=${1} 
NOHUP_LOG_FILE=${2} 
logmsg "Starting the server" 
/usr/bin/nohup `${SERVER_HOME}/bin/server.sh >> ${NOHUP_LOG_FILE} 2>&1 ` & 
sleep 5 
PID=`ps -ef|grep ${SERVER_HOME}/jvm |grep -v grep| awk '{print $2}'`   
if [ "${PID}" = "" ] 
then     
logmsg "Couldn't get the PID after starting the server" 
else    
logmsg "****** Server started with PID: ${PID} ****** " 
fi 
} 

logmsg() 
{ 
echo "`date '+%b %e %T'` : $1"$'\n' >> /tmp/STARTUP`date '+%Y%m%d'`_.log 
} 

#### Send an email ##### 
sendEmail() 
{    
RECIPIENTS="[email protected]" 
SMTP="1.1.1.1:25" 
mailx -s "$SUBJECT" -S "smtp=smtp://$SMTP" $RECIPIENTS < /tmp/STARTUP`date '+%Y%m%d'`_.log 
} 

##### Main ##### 
INTS[0]="/opt/server/inst01;/home/gut1kor/nohup.inst01.out" 
INTS[1]="/opt/server/inst02;/home/gut1kor/nohup.inst02.out" 
INTS[2]="/opt/server/inst03;/home/gut1kor/nohup.inst03.out" 

echo "##### Bringing up servers on `hostname`. #####"$'\n' > /tmp/STARTUP`date '+%Y%m%d'`_.log 

IS_TOTAL=${#INTS[@]} 

logmsg "Total Servers are: ${IS_TOTAL}" 

if [ "$IS_TOTAL" -gt "0" ] 
then 
for((i=0;i<IS_TOTAL;i++)) do 
IFS=";" read -a arr <<< "${INTS[$i]}" 
start_Server ${arr[0]} ${arr[1]} 
done 
fi 
sendEmail 

内容は、スクリプトがサーバーインスタンスをアップbringinで動作しますが、実行した後、私は、各インスタンスに対して実行中のスクリプトのための2つのプロセスを参照してください。


[[email protected] startAll]$ ps -ef|grep startAllComponents.sh 
gut1kor  63699  1 0 18:44 pts/2 00:00:00 /bin/sh ./startAllComponents.sh 
gut1kor  63700 63699 0 18:44 pts/2 00:00:00 /bin/sh ./startAllComponents.sh 
gut1kor  63889 61027 0 18:45 pts/2 00:00:00 grep startAllComponents.sh 

スクリプト実行後もこれらのプロセスがまだ存在するのはなぜですか?スクリプトにどのような変更を加える必要がありますか?

+0

最初にトップレベルスクリプトを実行していますか? –

+0

"nohupユーザがログオフした後もコマンドを実行し続けるコマンドはフォアグラウンドプロセスとして実行され、&が続く場合を除き、スクリプト内でnohupを使用する場合は、オーファンまたはゾンビプロセスの作成を避けるためにwaitと組み合わせてください。 – jgr208

答えて

1

nohupユーティリティを使用しているため、ほとんど同じです。このコマンドを使用する際の問題は、start_Server()関数呼び出しから呼び出されるたびに新しいプロセスを作成することです。あなたはおそらく、コマンドのプロセスIDを始めると、スクリプトの終了時に、それを殺すために必要nohupによって開始されたすべてのプロセスを殺すためにmanページ

nohup No Hang Up. Run a command immune to hangups, runs the given 
     command with hangup signals ignored, so that the command can 
     continue running in the background after you log out. 

から

/usr/bin/nohup $(${SERVER_HOME}/bin/server.sh >> ${NOHUP_LOG_FILE} 2>&1) & 
echo $! >> save_pid.txt  # Add this line 

スクリプトの最後に。

sendEmail 

while read p; do 
kill -9 $p 
done <save_pid.txt 
+0

あなたはそのようなバックチックでノーアップラインが疑わしいと思わないのですか?それは確かに私はいくつかの微妙なトリックを逃していない限り、OPはそれが何であるかをしていない。 – richq

+0

@Etan Reisner手動でスクリプトを実行しています(./startAllComponents.sh) – gut1kor

+0

@Inian詳細な説明をありがとうございます。はい、nohupが呼び出されるたびに、startAllComponents.shスクリプト用に2つの親プロセスが作成され、nohupコマンド自体に1つ作成されます。あなたが提案したようにnohupコマンドのPIDを手動で削除すると、スクリプトの親プロセスがクリアされていることがわかりました。スクリプトの提案された変更をテストし、結果を投稿します。ありがとうございました。 – gut1kor

関連する問題