nohup 명령어: 사용법과 nohup.out, 터미널을 닫아도 계속 실행하기

터미널을 닫거나 SSH 접속이 끊겨도 작업이 계속 돌게 하려면 nohup 명령어로 실행합니다. nohup은 터미널이 닫힐 때 오는 끊김 신호(SIGHUP)를 무시하게 한 채 명령을 실행합니다. AlmaLinux 9 서버에서 nohup을 붙인 sleep과 붙이지 않은 sleep을 함께 띄우고 터미널을 닫아 본 결과, nohup으로 띄운 쪽만 남아 계속 실행되었습니다.
아래 출력은 AlmaLinux 9.8 서버(root 계정)와 Debian 12 서버(일반 계정)에서 실행한 결과입니다. 오래 도는 작업 대신 sleep을 띄웠고, 끝낼 때는 띄울 때 받은 PID만 지정했습니다. 시각은 UTC로 출력했습니다.
1️⃣ nohup 명령어 사용법
nohup은 실행할 명령 앞에 붙이고, 명령 끝의 &로 백그라운드 실행을 지정합니다. GNU 공식 매뉴얼 기준으로 nohup 자체는 명령을 백그라운드로 보내지 않으므로, &를 빼면 명령이 끝날 때까지 프롬프트가 돌아오지 않습니다.
nohup sleep 300 &[1] 3431609
nohup: ignoring input and appending output to 'nohup.out'[1]은 작업 번호, 3431609는 띄운 프로세스의 PID입니다. 이어서 나온 문구는 키보드 입력을 받지 않고, 출력은 nohup.out 파일에 이어 쓴다는 안내였습니다.
방금 띄운 작업의 PID는 $!에 남으므로, 띄운 직후 [echo $!]로 확인해 적어 두면 상태를 볼 때나 끝낼 때 그 번호를 그대로 사용합니다.
echo $!3431609터미널을 닫으면 셸이 끊김 신호를 받고, 그 셸에서 띄운 작업에도 같은 신호를 보냅니다(Bash 공식 매뉴얼 기준). 이 동작을 확인하기 위해 새 터미널에서 [nohup sleep 300 &]와, nohup 없이 [sleep 301 &]를 함께 띄웠습니다.
sleep 301 &[2] 3432892jobs -l[1]- 3432883 Running nohup sleep 300 &
[2]+ 3432892 Running sleep 301 &두 작업이 Running인 상태에서 터미널 창을 닫고, 다른 셸에서 두 PID를 ps로 확인했습니다.
ps -p 3432883,3432892 -o pid,stat,etime,cmd PID STAT ELAPSED CMD
3432883 S 00:05 sleep 300nohup으로 띄운 sleep 300만 남았고, nohup 없이 띄운 sleep 301은 터미널을 닫을 때 함께 끝났습니다.
nohup으로 띄운 프로세스는 방해 금지 모드를 켠 휴대폰과 같습니다.
nohup은 coreutils 패키지에 들어 있는 명령입니다. 설치된 버전은 --version의 첫 줄로 확인합니다. AlmaLinux 9.8 서버는 8.32, Debian 12 서버는 9.1이었습니다.
nohup --version | head -1nohup (GNU coreutils) 8.32nohup --version | head -1nohup (GNU coreutils) 9.12️⃣ nohup.out과 출력 리다이렉트
출력을 따로 정하지 않으면 nohup은 명령의 출력을 지금 폴더의 nohup.out에 이어서 기록합니다. 처음 만들어진 nohup.out은 크기가 0이었고, 권한은 만든 사용자만 읽고 쓰는 -rw-------였습니다.
ls -l nohup.out-rw------- 1 root root 0 Oct 28 23:04 nohup.outGNU 공식 매뉴얼은 umask 설정과 상관없이 nohup.out을 만든 사용자만 읽고 쓸 수 있게 만든다고 설명합니다. 지금 폴더에 쓸 수 없으면 홈 폴더의 $HOME/nohup.out에 쓰고, 그곳에도 쓸 수 없으면 명령을 실행하지 않습니다.
출력이 있는 명령을 nohup으로 실행하자, 명령이 끝난 뒤 출력이 nohup.out에 남았습니다.
nohup sh -c 'echo start; sleep 2; echo end' &[1] 3431985
nohup: ignoring input and appending output to 'nohup.out'cat nohup.outstart
end
[1]+ Done nohup sh -c 'echo start; sleep 2; echo end'마지막 줄의 Done은 작업이 끝났다는 셸의 알림입니다. nohup.out은 실행할 때마다 새로 만들어지지 않고 같은 파일 끝에 이어 쓰이므로, 같은 폴더에서 여러 작업을 띄우면 출력이 한 파일에 섞입니다.
작업마다 로그를 나누려면 >로 출력 파일을 정하고, 2>&1로 오류 출력도 같은 파일에 보냅니다.
nohup sh -c 'echo start; sleep 300' > job.log 2>&1 &[1] 3432059cat job.lognohup: ignoring input
start2>&1까지 붙이자 터미널에는 작업 번호와 PID만 나왔고, nohup의 안내 문구 [nohup: ignoring input]은 로그 파일 첫 줄에 기록되었습니다.
>만 붙이고 2>&1을 빼면, 오류 출력을 표준 출력 쪽 파일로 돌린다는 안내가 터미널에 나옵니다.
nohup sleep 300 > job2.log &[2] 3432097
nohup: ignoring input and redirecting stderr to stdout출력을 남길 필요가 없는 작업은 /dev/null로 보냅니다. 이때도 터미널에는 작업 번호와 PID만 나왔습니다.
nohup sleep 300 > /dev/null 2>&1 &[3] 3432137네 가지 실행 꼴에서 출력이 간 곳과 터미널에 나온 문구는 아래와 같습니다.
| 실행 꼴 | 출력이 가는 곳 | 터미널에 나온 문구 |
|---|---|---|
| nohup 명령 & | 지금 폴더의 nohup.out | nohup: ignoring input and appending output to 'nohup.out' |
| nohup 명령 > 파일 & | 지정한 파일(오류 출력 포함) | nohup: ignoring input and redirecting stderr to stdout |
| nohup 명령 > 파일 2>&1 & | 지정한 파일 | 없음(안내 문구는 파일 첫 줄) |
| nohup 명령 > /dev/null 2>&1 & | 버림 | 없음 |
3️⃣ nohup 프로세스 확인과 종료
jobs 목록에는 지금 셸에서 띄운 작업만 나오므로, 터미널을 닫았다가 다시 접속한 뒤에는 nohup 프로세스를 ps -p로 PID를 지정해 확인합니다. 같은 셸에 있는 동안에는 jobs -l로 작업 번호와 PID, 상태를 함께 확인합니다.
jobs -l[1]+ 3431609 Running nohup sleep 300 &ps -p 뒤에 PID를 적고 -o로 칸을 고르면 그 프로세스 한 줄만 나옵니다. STAT의 S는 이벤트를 기다리며 잠든 상태이고, ELAPSED는 시작한 뒤 지난 시간입니다.
ps -p 3431609 -o pid,stat,etime,cmd PID STAT ELAPSED CMD
3431609 S 00:03 sleep 300끝낼 때는 kill 뒤에 PID를 적습니다.
kill 3431609kill은 아무것도 출력하지 않았고, 이어서 jobs를 실행하자 그 작업이 Terminated로 나온 뒤 목록에서 빠졌습니다.
jobs[1]+ Terminated nohup sleep 300같은 PID로 ps를 다시 실행하자 머리글만 나와, 프로세스가 끝난 것을 확인했습니다.
ps -p 3431609 -o pid,stat,etime,cmd PID STAT ELAPSED CMDnohup은 끊김 신호만 무시하므로, [kill -HUP]으로 같은 신호를 직접 보내도 끝나지 않습니다. nohup으로 띄운 sleep 305와 nohup 없이 띄운 sleep 306에 kill -HUP을 보냈습니다.
kill -HUP 3437119 3437128이어서 jobs -l로 확인하자 nohup 쪽만 Running으로 남았고, sleep 306은 Hangup으로 끝났습니다.
jobs -l[1]- 3437119 Running nohup sleep 305 &
[2]+ 3437128 Hangup sleep 306kill에 신호를 적지 않으면 SIGTERM을 보내므로, nohup으로 띄운 작업도 [kill PID]로 끝납니다.
4️⃣ nohup 명령어 disown 비교와 옵션
🔲 nohup과 disown 비교
disown은 이미 띄운 작업에 쓰는 bash 내장 명령으로, nohup 없이 &로 띄운 작업을 나중에 터미널의 끊김 신호에서 떼어 낼 때 사용합니다. disown은 출력을 nohup.out으로 돌리지 않으므로, 출력이 있는 작업은 띄울 때 > 파일로 출력 자리를 정해 둡니다.
Bash 공식 매뉴얼 기준으로 disown을 옵션 없이 쓰면 그 작업이 jobs 목록에서 빠지고, disown -h는 목록에 남긴 채 끊김 신호만 보내지 않습니다. 먼저 sleep 302를 띄운 뒤 disown을 실행했습니다.
sleep 302 &[1] 3433230disowndisown은 아무것도 출력하지 않았고, 이어서 실행한 jobs -l도 빈 결과였습니다.
jobs -l다음으로 sleep 303을 띄우고 작업 번호 %1에 disown -h를 실행했습니다.
sleep 303 &[1] 3433343disown -h %1jobs -l로 확인하자 작업이 목록에 그대로 남았습니다.
jobs -l[1]+ 3433343 Running sleep 303 &여기에 아무 처리도 하지 않은 sleep 304를 하나 더 띄우고 터미널을 닫은 뒤, 다른 셸에서 세 PID를 확인했습니다.
sleep 304 &[2] 3433474ps -p 3433230,3433343,3433474 -o pid,stat,etime,cmd PID STAT ELAPSED CMD
3433230 S 00:11 sleep 302
3433343 S 00:08 sleep 303disown과 disown -h를 쓴 두 작업은 남았고, 아무 처리도 하지 않은 sleep 304만 끝났습니다. 네 방법을 견주면 아래와 같습니다.
| 방법 | 쓰는 때 | jobs 목록 | 터미널을 닫은 뒤 | 출력 |
|---|---|---|---|---|
| nohup 명령 & | 띄울 때 | 남음 | 남음 | nohup.out 또는 지정한 파일 |
| 명령 & 뒤 disown | 띄운 뒤 | 빠짐 | 남음 | 바꾸지 않음 |
| 명령 & 뒤 disown -h | 띄운 뒤 | 남음 | 남음 | 바꾸지 않음 |
| 명령 & 만 | — | 남음 | 끝남 | 바꾸지 않음 |
작업 화면을 다시 불러와 이어서 입력해야 하는 일에는 tmux 같은 터미널 멀티플렉서가 맞고, 한 번 띄워 두고 결과만 파일로 받는 일에는 nohup으로 충분합니다.
🔲 nohup 명령어 옵션
📌 주요 옵션: 이 글에서 실행한 결과
| 옵션 | 하는 일 | 이 글에서 본 결과 | |
|---|---|---|---|
| --version | 버전 정보를 출력하고 끝냄 | AlmaLinux 9.8 서버는 nohup (GNU coreutils) 8.32, Debian 12 서버는 nohup (GNU coreutils) 9.1 |
📎 그 밖의 옵션: 공식 매뉴얼 기준
| 옵션 | 하는 일 | |
|---|---|---|
| --help | 도움말을 출력하고 끝냄 |
🔲 nohup 명령어 시뮬레이터
아래 시뮬레이터에서 nohup으로 작업을 띄우고, 🔌 칩으로 터미널을 닫았다가 다시 접속한 뒤 어떤 프로세스가 남는지 직접 확인할 수 있습니다.
🔢 FAQ & 추천 콘텐츠
ℹ️ 제휴 안내
본 사이트의 콘텐츠에는 제휴 링크가 포함되어 있습니다. 방문자가 이 링크를 통해 상품 또는 서비스를 구매하면 본 사이트는 판매처로부터 수수료를 지급받습니다. 이 과정에서 구매자가 지불하는 금액(이벤트 할인 시 금액이 내려갑니다↓)은 오르지 않습니다. 게시된 가격·할인·재고 정보는 작성 시점 기준이며 실제와 다를 수 있으므로, 구매 전 판매처에서 최종 확인하시기 바랍니다. 상품 선정과 평가는 자체 기준에 따라 작성되며, 수수료 지급 여부가 소개 순서나 평가 내용에 영향을 주지 않습니다.