Web Application Server 를 구동할 때 에러가 발생하는 것을 사전에 탐지하기 위하여, WAS 구동 script 에 log 를 확인하기 위한 UNIX shell tail 명령어를 걸어두는 경우가 많다. 아래가 tail 명령을 사용한 WAS startup script 이다.
#!/bin/sh
JAVA_OPTIONS=......
CLASS_PATH=......
nohup java -cp $CLASSPATH $JAVA_OPTIONS > waslog.out &
tail -f waslog.out
이렇게 작성하면 Java 로 구동된 WAS 가 발생하는 모든 표준 출력이 화면으로 redirect 된다.
그런데, 이것은 대단히 위험한 script 작성 방법 일 수 있다. 큰 시스템 장애를 만들 수도 있다. 만약 개발자 또는 시스템 관리자가 WAS 구동 이후 log 를 tail 하고 있는 상태에서정상적인 UNIX 시스템 Logout 없이 Shell program 이 종료 되면 WAS 가 kill 될 수 있고, 운영 중인 시스템에 큰 데미지를 입힐 수 있다.
그 이유를 알기 위해서는 nohup 으로 WAS 를 구동할 때 일어나는 Process grouping 과 Shell process 의 child invoke 매커니즘을 이해해야 한다.
첫번째, nohup 명령의 동작 특성 대하여 알아보자.
nohup POSIX 명령어는 Process 가 HUP(=Hang up) Signal 을 무시하도록 만든다. 이 HUP Signal 은 사용자가 접속한 Session 의 Shell Process 가 통신을 종료할 때 자식 Process 들에게 전파된다. 그래서 UNIX Shell 에 접속한 상태에서 logout 하는 경우 그 Shell 이 실행했던 모든 Program 이 종료된다. nohup 으로 Process 를 실행하면 HUP Siganl 을 무시하기 때문에 사용자의 login 여부와 상관없이 시스템에서 계속 실행이 되는 것이다.
OS 마다 다르긴 한데 nohup 으로 띄운 Process 는 자신을 실행한 Parent process 가 종료되면 사용자 Session 의 Shell process 의 자식으로 입양되었다가, Shell 이 종료되면 HUP Signal 을 받으면 일시적으로 Orphan process 가 되었다가 System Mothe shell process(=PID 1) 로 입양된다.
두번째, UNIX System 의 Process invocation 에 대하여 알아보자.
아래 그림은 UNIX System 에 접속한 상태에서 WAS 가 구동될 때 Process 의 가계도이다.
nohup Process 가 WAS 프로그램이다. 앞에서 보았듯이 Startup shell script process 가 종료되면 User shell process 로 WAS process 가 입양된다. 그러나 parent 가 종료되지 않으면 계속해서 Shell script process 의 자식으로 남아있게 된다.
tail 명령은 Shell script process 의 Child process 로 구동되는데, 이 녀석은 무한루프를 돌면서 stdout 을 가로챌 준비를 한다. 그러므로 Shell script process 는 자식이 작업을 마치길 기다리느라 종료되지 않는다.
이 상황에서 HUP Signal 이 발생하면 User shell 이 HUP Signal 을 접수하여 자식들에게 HUP 을 전파한다. 그런데 Shell script process 는 HUP 을 전파하지 않고 자신이 종료되어야 하기 때문에 아직 살아있는 Child process 에게 Kill Signal 을 전파하게 된다.
그 결과로 tail 뿐만 아니라 WAS Process 도 HUP 이 아니라 Kill signal 을 받아 죽게 된다.
truss -t\!all -sall -Sall -f ./startWAS.sh >& trusslog.log &
위 명령어는 startWAS.sh 를 실행하였을 때 받게되는 모든 OS Signal 을 trusslog.log 에 저장하는 명령인데 실제로 tail 이 포함된 shell process 가 어떤 OS Signal 을 받는지 기록해보면 tail 명령의 위험성을 더 잘 알 수 있을 것이다. 그리고 HUP Signal 을 고의로 발생시키려면 tail 이 되고 있을 때, Shell program 을 강제종료 시키면 된다.
tail 명령은 WAS 구동 관련 script 에 절대로 있어서는 안 된다. 따로 로그 확인을 위한 script 를 작성하는 것이 좋다.