はじめに

JenkinsのリモートSSHプラグインでpty(pseudo tty)にチェックをつけ、tomcat起動するスクリプトを実行すると、起動直後に終了してしまうことがある。

原因

原因は、sshがログアウトすると同時に、tomcat起動コマンドの中で実行しているバックグランドコマンドが終了してしまうから。

tomcat6/bin/startup.shを見ると、tomcat6/bin/catalina.shを呼び出している。起動時、catalina.shには"start"が引数で渡されるので、該当箇所を見てみるとバックグランド実行&がついていた。

"$_RUNJAVA" "$LOGGING_CONFIG" $LOGGING_MANAGER $JAVA_OPTS $CATALINA_OPTS \
      -Djava.endorsed.dirs="$JAVA_ENDORSED_DIRS" -classpath "$CLASSPATH" \
      -Dcatalina.base="$CATALINA_BASE" \
      -Dcatalina.home="$CATALINA_HOME" \
      -Djava.io.tmpdir="$CATALINA_TMPDIR" \
      org.apache.catalina.startup.Bootstrap "[email protected]" start \
      >> "$CATALINA_OUT" 2>&1 &

解決策

nohupコマンドでnohup.outではなく標準出力に出力する方法で書いた通り、ログアウト後も処理を続けたりする場合は、nohupコマンドを使用する。

tomcat起動とapache起動をJenkinsからptyで行うために、次のように修正した。

■もともと

sudo -u tomcat /opt/tomcat6/bin/startup.sh

→ビルド実行後、即異常終了してしまう。

■修正1回目

sudo -u tomcat nohup /opt/tomcat6/bin/startup.sh >/dev/null 2>&1

→今までJenkinsのコンソールに表示されていたhttpd を起動中: [ OK ]の出力が、/dev/nullに捨てたことで表示されなくなった。
nohup.outに出力されるのも嫌だったので、標準出力に出るよう修正が必要

■修正2回目

cat <(sudo -u tomcat nohup /opt/tomcat6/bin/startup.sh 2>&1 </dev/null)