데몬(daemon) : 사용자와 직접 대화하지 않고 백그라운드에서 특정 서비스를 제공하는 프로세스.
대표 예: 웹 서버(httpd), SSH 접속(sshd), 예약 작업(crond), 메일(postfix).
이름 끝에 'd'가 붙는 관례가 있어 sshd·httpd·crond처럼 d로 끝나면 십중팔구 데몬이다.
데몬의 특징은 다음과 같다.
특징
설명
제어 터미널 없음
특정 터미널에 묶이지 않아 로그아웃해도 계속 동작
백그라운드 상주
부팅 시 시작되어 시스템 종료까지 메모리에 상주
부모는 보통 1번
systemd/init이 직접 관리하거나 입양
이름에 'd'
sshd, httpd, crond, rsyslogd 등
데몬이 서비스를 제공하는 방식은 크게 두 가지다.
방식
동작
예
Standalone(독립)
데몬이 항상 떠 있다가 요청을 직접 처리
httpd, sshd
Super-daemon(슈퍼)
xinetd/inetd가 대기하다 요청 시 자식 데몬 실행
옛 telnet, ftp
standalone 방식은 응답이 빠르지만 항상 메모리를 차지한다. super-daemon(xinetd) 방식은 평소 메모리를 아끼지만 요청마다 새로 띄우느라 응답이 느리다. 자주 쓰는 서비스는 standalone, 가끔 쓰는 서비스는 super-daemon이 유리하다는 트레이드오프가 시험에 나온다.
'daemon'은 그리스 신화의 "보이지 않게 일을 돕는 정령"에서 따왔다. MIT의 Project MAC에서 백그라운드 보조 프로세스를 이렇게 부른 것이 시초다. 악마(demon)와 철자가 다르며, 사용자 눈에 안 보이게 묵묵히 일한다는 뜻을 담았다.
⚠️ 함정: Ctrl+Z는 종료가 아니라 일시 정지(SIGSTOP, 상태 T)다. 종료는 Ctrl+C(SIGINT)다. 정지된 작업은 bg/fg로 되살려야 하며, 그냥 두고 셸을 닫으면 사라질 수 있다. 또한 &만으로는 셸 종료 시 SIGHUP을 받아 죽을 수 있으므로, 로그아웃 후에도 살리려면 nohup을 함께 써야 한다.
직접 쳐보기: sleep 300을 실행하고 Ctrl+Z로 멈춘 뒤 jobs로 상태가 Stopped인지 본다. bg %1로 재개하면 Running으로 바뀐다. fg %1로 다시 가져와 Ctrl+C로 종료하면 완전히 사라진다. 작업 제어의 한 사이클이다.
예: 셸에서 ls를 치면 셸이 자신을 fork해 자식을 만들고, 그 자식이 exec로 ls가 된 뒤 실행을 마치면 종료된다.
부모 셸은 wait()로 자식이 끝나길 기다렸다가 프롬프트를 돌려준다.
시스템 호출
역할
PID 변화
fork()
프로세스 복제(자식 생성)
새 PID 생성
exec()
현재 프로세스를 다른 프로그램으로 교체
PID 유지
wait()
부모가 자식 종료를 기다리고 회수
—
exit()
프로세스 종료(종료 코드 반환)
—
exec는 새 프로세스를 만들지 않는다. 현재 프로세스의 껍데기(PID)는 그대로 두고 알맹이(실행 코드)만 갈아끼운다. 그래서 exec ls를 셸에서 직접 치면 셸 자신이 ls로 변신해 버려, ls가 끝나면 셸도 함께 종료된다. fork(복제)와 exec(교체)를 분리한 것이 유닉스의 우아함이다.
fork-exec 분리 덕분에 셸은 자식을 fork한 직후, exec 전에 입출력 리다이렉션(>, <)이나 파이프(|)를 설정할 수 있다. 만약 "복제와 교체"가 한 번에 묶여 있었다면 이런 유연한 입출력 재배치가 불가능했을 것이다. 이 설계가 유닉스 파이프라인 철학의 토대다.