Linux 명령어 | 프로세스 관리 | nohup 세션이 끊겨도 계속 실행
nohup 명령어
nohup
명령어는 로그아웃 등과 같이 터미널과의 세션 연결이 끊기더라도 프로세스가 계속 동작되도록 해준다.
일반적으로 터미널과의 세션 연결이 끊기게 되면 리눅스에서는 해당 세션에서 실행된 프로세스들에게 HUP(Hang Up,끊다) 시그널을 전달하여 프로세스들이 종료되도록 한다.
이 때, nohup
명령은 “세션이 종료되더라도 계속 실행하게 하고 싶은 프로세스에는 HUP 시그널을 전달하지 않도록(No Hang Up,끊지마) 한다"는 의미이다.
nohup 기본 사용법
기본적인 명령어는 다음과 같다.
nohup [command]
nohup
명령 사용법을 빠르게 익히기 위해 간단한 스크립트를 작성해서 nohup
명령으로 실행시켜 보도록 하겠다.
스크립트 작성
nohup
명령의 실행시킬 스크립트를 아래와 같이 작성한다.
test.sh
#!/bin/bash
for i in {1..10}
do
sleep 5
done
이 스크립트는 반복이 10번이 실행된다. 중간에 sleep 5
가 있어 5초에 멈췄다가 다시 반복되기에 총 50초가 되면 종료된다.
스크립트 파일 권한 변경
nohup
명령어를 이용하여 실행할 명령어 파일의 권한은 755(rxwrx-rx-) 이상이어야 하기 때문에 작성된 스크립트 파일 권한을 755으로 지정한다.
chmod 755 test.sh
스크립트 파일 nohup 명령으로 실행
nohup
명령으로 스크립트를 실행해 보면, 아래와 같은 메세지 표시가 된다.
% nohup ./test.sh
appending output to nohup.out
이렇게 실행 시키면, 프로세스는 대기 상태가 되고 Ctrl+C
를 누르면 종료 된다.
그리고, 해당 스크립트 프로그램의 표준 출력이 nohup
을 실행 시킨 경로에 nohup.out
파일에 출력된다.
nohup 명령의 표준 출력을 다른 파일에 쓰기
표준 출력을 다른 파일에 쓰기 위에서는 리다이렉션(>
, >>
)을 사용하면 된다.
nohup ./test.sh > nohup_test.out
아예 표준 출력을 쓰고 싶지 않다면 다음과 같이 하면 된다.
nohup ./test.sh > /dev/null
표준 출력과 에러 출력
때로는 표준 출력과 표준 에러룰 각각 다른 파일에 써야 할 경우가 있고, 같은 파일에 쓰고 싶은 경우도 있을 것이다. 이럴 경우에 대해 각각 알아 보겠습니다.
0 : 표준 입력
1 : 표준 출력
2 : 표준 에러
표준 출력과 표준 에러 출력을 각각 다른 파일에 쓰기
nohup ./test.sh 1 > test.out 2 > test.err
표준 출력(1)은 test.out
파일로 리다이렉션하고, 표준 에러(2)는 test.err
파일로 리다이렉션 하겠다는 의미이다.
표준 출력과 표준 에러를 같은 파일에 쓰기
nohup ./test.sh > test.log 2>&1 &
표준 출력을 test.log
에 쓰고, 표준 에러(2)도 표준 출력(1)이 쓰여지는 파일에 리다이렉션 하겠다는 의미이다.
nohup 명령을 백그라운드(&)로 실행
&
를 사용하면 프로그램이 백그라운드로 실행이 되게 된다.
% ./test.sh &
여기서 Ctrl+C
를 누르지 않아도 대기 상태가 되지 않는다.
다음 명령으로 백그라운드로 실행되고 있는 것을 확인 할 수 있다.
% ps -ef | grep test.sh
여기서 nohup
과 &
의 차이은 무엇인가?
nohup
명령은 프로그램을 데몬으로 형태로 실행시키는 것이기에 앞에서 설명했듯이 로그아웃 등과 같이 세션 연결이 끊기더라도 프로세스가 계속 동작된다. 그러나, 실행 시키면 대기 상태가 발생하고
Ctrl+C
를 누르면 프로세스는 바로 종료된다.
그에 비해, 백그라운드(&
) 실행은 실행 시키면 대기 상태가 없지만, 세션 연결이 끊기면 실행한 프로그램도 함께 종료된다.
그러면, 다음과 같이 nohup
명령을 백그라운드(&
)로 같이 실행시키게 되면, 대기 상태도 없고 세션 연결이 끊기더라도 프로세스의 종료 없이 백그라운드로 실행되게 된다.
% nohup nohup ./test.sh > /dev/null &
이 내용을 정리를 하자면 아래와 같다.
명령 | Ctrl+C |
터미널 종료 |
---|---|---|
[command] |
명령이 중단됨 | 명령이 중단됨 |
[command] & |
명령이 중단되지 않음 | 명령이 중단됨 |
nohup [command] |
명령이 중단됨 | 명령이 중단되지 않음 |
nohup [command] & |
명령이 중단되지 않음 | 명령이 중단되지 않음 |
프로세스 종료
프로세스 종료는 먼저 다음 명령으로 프로세스 아이디를 조회한다.
% ps -ef | grep test.sh
501 61324 21348 0 7:34AM ttys001 0:00.01 /bin/bash ./test.sh
501 61329 21348 0 7:34AM ttys001 0:00.00 grep test.sh
조회 프로세스 아이디를 kill
명령으로 종료시키면 된다.
% kill 61324