[Linux] nohup 세션이 끊겨도 계속 실행되도록 해보자
개요
nohup 명령어는 리눅스에서 프로세스를 실행한 터미널의 세션 연결이 끊어지더라도 지속적으로 동작 할 수 있게 해주는 명령어입니다.
기본적으로 터미널에서 세션 로그아웃(logout)이 발생하면
리눅스는 해당 터미널에서 실행한 프로세스들에게 HUP signal 이 전달하여 종료시키게 되는데,
이 HUP signal을 프로세스가 무시(ignore)하도록 하는 명령어라서 nohup 이라는 이름인 것입니다.
그래서 결과적으로 터미널에서 연결이 끊기거나 터미널을 종료해도 실행했던 프로세스들이 계속 실행될 수 있는 것입니다.
또한 nohup 명령어는 표준 출력(standard output)을 nohup.out 파일로 재지향(redirection) 합니다.
터미널이 종료되어도 표준 출력은 nohup.out 파일에 계속해서 기록되기 때문에 프로세스의 상태를 확인하는데 유용 할 수 있습니다.
그러나 필요 이상의 로그를 화면에 계속해서 출력하게 되면 nohup.out 파일의 용량이 매우 커지기 때문에 디스크 공간을 낭비하게 될 수 있습니다.
따라서 꼭 필요한 로그만 출력하거나 로그를 남기는 것이 불필요한 경우 재지향을 통해 nohup.out 파일을 생성하지 않도록 하는 것이 좋습니다.
사용법
nohup 명령어의 사용법은 매우 단순합니다.
nohup [프로세스] &
[프로세스] 부분에 실행하고자 하는 프로그램이나 스크립트를 지정하면 됩니다.
여러분이 작성한 스크립트를 넣어도 되는데 스크립트 파일의 권한이 755 이상이어야 합니다.
일반적으로 nohup 명령어를 사용할 때는 백그라운드 작업으로 실행하는 경우가 많기 때문에 뒤에 & 를 붙여서 백그라운드 실행이라는 것을 명시해 줍니다.
nohup.out 파일을 생성하지 않으려면 표준출력과 표준에러를 /dev/null 로 재지향 해주면 됩니다.
nohup [프로세스] 1>/dev/null 2>&1 &
1>/dev/null 은 표준 출력을 사용하지 않겠다는 의미이고, 2>&1 은 표준 에러를 표준 출력과 같게 만드는 명령어입니다.
nohup 으로 실행한 프로세스를 종료하려면 먼저 ps 명령어로 PID를 식별한 다음,
kill 명령어를 사용하여 해당 프로세스에 종료 시그널을 보내서 종료해야 합니다.
ps -ef | grep [프로세스명]
# PID 식별 후
kill -15 [PID]
# 종료되지 않으면 강제 종료 (비권장)
kill -9 [PID]
위에서 사용된 재지향, kill, ps 명령어 등은 아래 글들을 참고해주세요.
-Peter의 우아한 프로그래밍
여러분의 공감과 댓글은 저에게 크나큰 힘이 됩니다. 오류 및 의견 주시면 감사하겠습니다.