로그 파일 보려고 터미널에서 tail 명령어를 실행했다 치자.
$ tail -f access.log
이 명령어는 tail 프로세스가 실행되는 동안 access.log 에 추가된 내용을 콘솔에 출력한다.
tail, top, vi 처럼 서버에 접속 뒤 터미널에서 실행하는 프로그램은 기본적으로 포그라운드 프로세스로 실행된다. 포그라운드 프로세스는 터미널에 연결된 프로세스로, 키보드나 스크린을 통해 상호작용함. 포그라운드 프로세스는 터미널과 연결되어 있어 사용자와 터미널의 연결이 끊기면 종료됨
터미널은 콘솔, 셸, 프롬프트 등으로 불리기도함
톰캣 같은 서버 프로세스는 항상 실행되어야 됨. 그래서 포그라운드가 아닌 백그라운드 프로세스로 실행한다.
백그라운드 프로세스는 터미널과 연결되지 않는 프로세스를 지칭. 터미널과 연결되어 있지 않아서 키보드, 스크린으로 상호작용 불가.
리눅스에서 프로세스를 백그라운드로 실행하려면 명령어 뒤에 &를 붙이면 된다.
$ java -Dserver.port=9090 -jar server.jar &
&를 붙이면 백그라운드로 되긴한데, 사용자가 로그아웃 하면 터미널에서 실행한 백그라운드 프로세스가 같이 종료될수도 있다. 터미널을 종료해도 백그라운드 프로세스가 계속 실행되게 하려면 추가로 nohup 명령어와 $를 함께 사용하면된다.
$ nohup java -Dserver.port=9090 -jar server.jar & [1] 12345
$ nohup: ignoring input and appending output to 'nohup.out'
nohup
nohup은 No Hang Up 뜻하는 명령어. 로그아웃처럼 터미널이 끊길 때 전송되는 HUP 시그널이 프로세스에 전달되지 않게함. HUP 시그널을 처리하는 방식은 프로그램마다 다르며 HUP 시그널 받는다고 반드시 프로세스가 종료되는건 아님
nohup 으로 실행한 프로세스가 콘솔에 출력하는 내용은 기본적으로 nohup.out 파일에 기록됨. 다른 파일에 기록하고 싶으면 다음 첢 리눅스의 리디렉션 쓰면 된다.
$ nohup java -jar server.jar > server.log 2>&1 &
2>&1
리눅스에서 위 표현을 자주볼수있음 이건 다음을 의미함.
- 2: 표준 오류(System.err.println 메서드로 출력하면 표준 오류로 출력됨)
-
: 리디렉션 연산
- &1: 표준 출력 즉, 표준 오류를 표준 출력과 동일한 경로로 전달하라는 의미