자주쓰이는 명령어 중 하나인 Nohup 명령어에 대해 알아보도록 하겠습니다~
일반적으로 SSH를 통해 프로그램을 실행할 때 연결이 끊기거나 로그아웃하면 세션이 종료되면
터미널은 실행한 프로세스들에게 HUP Signal을 전달 하여 모든 프로세스를 중지 시킵니다
중지 시그널 HUP Signal을 무시하고, 프로세스를 실행한 터미널의 세션 연결이 끊어지더라도
지속적으로 동작 할 수 있게 해주는 명령어가 nohup 명령어 입니다.
no(=Ignore) hup , 즉 HUP Signal을 무시하라는 뜻의 명령어입니다
nohup 명령 사용법
1. 포그라운드 nohup명령어 수행
nohup 명령어는 아래와 같습니다.
프로세스 및 실행 명령어 부분에 실행하고자하는 스크립트나 프로세스를 기입해주면 됩니다
이러한 command 명령어는 포그라운드 시점에서 명령어를 수행한다고 표현합니다
출력 결과는 nohup을 실행 시킨 경로에 nohup.out 파일로 리디렉션 됩니다
nohup {프로세스 및 실행 명령어}
테스트를 위해 예제 스크립트를 아래와 같이 작성해봤습니다
test 문자열을 2초 sleep 주고 무한 반복 실행하는 스크립트입니다
vi test.sh
while true; do echo "test" sleep 2 done
참고로 스크립트 파일 권한은 755이상이어야 정상적으로 실행됩니다.
nohub 명령어를 실행 했고 실행한 결과가 nohup.out 파일로 리디렉션 되었음을 나타납니다.
실행 시킨 위치에 nohup.out 파일이 생성되었음과 출력 내용이 쌓이는 것을 확인 할 수 있습니다
이렇게 포그라운드로 nohup 명령어를 수행 해 봤습니다
2. 백그라운드 nohup 명령어 수행
nohup을 포그라운드에서 수행 시 명령어가 완료 될때까지 접속한 터미널 및 셸과 상호작용을 할 수 없습니다.
불편하다고 느껴지지 않나요?
불편하니까 터미널 및 쉘과 상호작용을 하도록 백그라운드 수행 명령어를 이용해 수행시킵니다
명령을 백그라운드에서 실행하려면 명령 끝에 & 기호를 추가하면 됩니다~
간단하져?
nohup {프로세스 및 실행 명령어} &
출력결과는 그대로 nohup.out 파일에 추가되는 것을 확인 할 수 있습니다~
백그라운드로 작동하기때문에 원하는 명령어를 추가 입력 할 수 있습니다
3. nohup 프로세스 종료
포그라운드로 실행 했을 경우에는 Ctrl + z 버튼을 이용해 쉘을 종료시키면 실행중인 프로세스가 종료되었지만
백그라운드에서 실행 했을 경우에는 pid를 찾은 후 kill 명령어를 이용해줘야만 nohup 프로세스가 정상적으로 종료됩니다
nohup.oput 파일을 삭제한다고 해서 nohup 프로세스가 종료되지 않습니다
test.sh 쉘 파일을 수행시켰기때문에 수행 명령어에 test.sh를 입력하였습니다
다른 명령어를 수행 했으면 해당 명령어로 입력해주세요~ :)
ps -ef | grep test.sh #수행 명령어
수행시킨 쉘 프로세스 PID가 9034인것을 확인 할 수 있습니다.
이제 해당 프로세스를 kill 명령어를 이용해 종료하도록 하겠습니다
kill -9 9034 #프로세스 id
프로세스를 조회해보면 정상적으로 프로세스가 종료된것을 확인 할 수 있습니다
4. 출력 파일 생략하기
nohup 출력 결과인 nohup.out 파일을 생성하고 싶지 않을 경우도 존재합니다.
출력 결과가 많다면 디스크 용량만 차지 할 수도 있기때문입니다.
log 파일을 생성하지 않기 위해서는 "/dev/null" 명령어를 사용합니다
nohup {프로세스 및 실행 명령어} 1>/dev/null &
숫자의 의미는 다음과 같습니다.
0 : 표준 입력 , 1: 표준 출력, 2: 표준 에러
즉, 위의 명령어는 프로세스 실행 출력 결과를 /dev/null로 전달하여 버려달라는 뜻 입니다
하지만 표준 에러(stderr) 의 경우 아래 명령어 결과에 나와있는 것처럼 그대로 출력 될 것 을 의미합니다
그럼 실행한 결과 말고 에러 출력 결과도 나오게 하고싶지 않으면 어떻게 해야될까요?
똑같이 "/dev/null" 명령어를 추가해줘서 사용하면 됩니다~
nohup sh test.sh 1>/dev/null 2>/dev/null &
근데... 앞에서도 "/dev/null" 명령어를 쓰고.. 뒤에서도 똑같이 또 쓰려니까 너무 귀찮지 않나요 ?-?
그리하여 "/dev/null" 명령어 대신 &1 을 사용합니다.
2>&1
표준 에러(2)를 표준 출력(1) 이 전달되는 곳 (/dev/null) 로 동일하게 전달시켜주라는 뜻 입니다.
nohup sh test.sh 1>/dev/null 2>&1 &
위의 명령어가 간편하기때문에 보통 아래의 형식으로 많이 사용하고 있습니다~
nohup {프로세스 및 실행 명령어} 1>/dev/null 2>&1 &
5. 출력 파일 변경하기
출력 파일을 생략하는 것이 아니라 내가 원하는 위치와 파일명으로도 변경 할 수 있습니다.
방식은 생략하는거와 거의 유사합니다.
다른 점이 존재한다면 생략할 경우에는 /dev/null 을 이용했지만, 변경할때에는 변경 위치 및 파일명으로 대체된다는 점 입니다.
nohup {프로세스 및 실행 명령어} 1> {출력 파일 위치 및 파일명} 2>&1 &
출력 파일물을 현재위치의 test_output.log로 생성되도록 변경 후 조회해보니 아래와 같이 파일이 생성된 것을 확인 할 수 있습니다~
그럼 끝~~~~
'Linux' 카테고리의 다른 글
[Linux] 프로세스 시작시간 종료시간 확인하기 (0) | 2023.12.22 |
---|---|
[Linux]프로세스 할당량 및 정보 확인하기 (0) | 2023.12.22 |
[Linux] 나만의 리눅스 명령어(alias 별칭) 만들기 (0) | 2022.11.14 |
[Linux] 쉘 스크립트 종류 (0) | 2022.07.28 |