[OS] 데몬(daemon) 프로세스, nohup, &

2022. 1. 3. 18:40[ Basic ]/# OS

데몬이란

- 사용자와 직접적으로 대화하지 않고, 백그라운드에서 오랫동안 돌면서 여러 작업을 하는 프로세스

- 데몬은 대개 부모 프로세스를 갖지 않으며, 즉 PPID(부모 프로세스 ID)가 1이며, 따라서 프로세스 트리에서 init 바로 아래에 위치함

- 데몬이 되는 방법은 일반적으로 자식 프로세스를 포크하고 자신을 죽이면서 init(PID=1)이 고아가 된 자식 프로세스를 자기 밑으로 데려가도록 하는 방식(fork off and die 방식)

- 부모 프로세스는 fork호출 후 exit호출함으로써 자식 프로세스가 백그라운드에 남게 함

- 데몬 프로세스는 보통 네트워크 요청, 하드웨어 동작을 위한 용도로 사용되며 시스템이 시작될 때 데몬을 생성하는 경우가 많음

- 보통 프로세스 이름에 d가 붙는다 (httpd, nfsd, sshd)

- cron처럼 주기적인 작업을 수행하는 용도로 사용되기도 함

- 부모 프로세스가 열어둔 파일들을 모두 닫음. 로그 파일이나 콘솔, 또는 /dev/null을 stdin, stdout, stderr로 설정

 

* 예시: sshd 데몬 프로세스가 PPID를 1로 갖고 있음

 

 

 

 

nohup 커맨드

- no hang up을 줄인 키워드 명령어로 프로세스 중단(hang up) 시그널을 무시하고 실행하는 명령어

- 단순히 ./{실행파일} 로 프로세스를 실행하면 터미널 종료 시에도 프로세스도 함께 종료됨

- 기본적으로 프로세스 실행 시 부모 프로세스인 터미널이 fork, exec을 실행해 프로세스가 실행되며 부모 프로세스 종료 시 자식 프로세스에 hang up 시그널을 날려 함께 종료되도록 함

- nohup은 부모 프로세스(터미널)가 종료 시, 자식 프로세스에게 '프로세스 종료 시그널(hang up 시그널)'이 가지 않는 형태임

- 터미널 종료 후에도 프로세스를 데몬'처럼' 실행(백그라운드에서 실행되는 것은 아님)

- nohup으로 실행시킬 경우, 권한이 최소 755 이상으로 설정되어야 함

- nohup으로 실행시킨 프로세스의 표준 출력은 default로써 nohup.out 파일로 기록됨

- 지정한 파일로 표준 출력을 하고 싶을 경우 : nohup {실행파일} > {출력 파일}

- 출력을 원치 않을 경우 : nohup {실행파일} > /dev/null

 

 

& 키워드

- 명령어 뒤에 &를 붙이면 기본적으로 '백그라운드'에서 실행되게 함

- & 키워드는 백그라운드에서 프로세스를 실행시킨다는 의미일 뿐 부모 프로세스 종료 시 자식 프로세스도 종료됨

- 하지만 최근 nohup과 같은 동작을 하도록 설정되어 있음

- 따라서 '백그라운드'에서 돌면서 '터미널 종료 시에도 프로세스가 종료되지 않게' 하려면 nohup과 &를 모두 사용하면 됨

ex) nohup {실행파일} &

- 프로세스 종료는 실행 중인 프로세스에 kill 커맨드를 통해 시그널 9번을 주면 됨

 

- PPID : 1

 

정리

- {실행파일} : 터미널 종료 시 프로세스도 종료(부모 프로세스 종료에 대한 시그널을 처리함)

- nohup {실행파일} : 터미널을 종료해도 프로세스 실행(부모 프로세스가 보낸 종료 시그널 처리 안 함)

- nohup {실행파일} & : 프로세스를 백그라운드에서 실행 + 터미널(부모 프로세스)이 종료되어도 실행됨

- {실행파일} & : 프로세스를 백그라운드에서 실행

 

 

cf. 로그파일 구분하기

- nohup을 사용하더라도 표준 입력(0), 표준 출력(1), 표준 에러(2) 파일 스트림 번호(파일 디스크립터)는 유지됨

- 따라서 각각의 경우에 다른 파일로 로그를 남기고 싶다면 다음과 같이 명령어 실행

-> nohup {실행파일} 1 > file1.out 2 > file2.err &

- 표준 출력과 표준 에러를 같은 파일에 기록

-> nohup {실행파일} > file1.log 2>&1 &

 

 

 

Reference

- https://brownbears.tistory.com/164

'[ Basic ] > # OS' 카테고리의 다른 글

[ubuntu] apt의 이해  (0) 2022.06.30
[OS] ForkJoinPool  (0) 2022.06.18
<추천>[OS] Context Switching, Cache Pollution / TLB, MMU  (0) 2022.05.28
[OS] 현대 OS의 Deadlock 처리  (0) 2021.11.22
[OS] interrupt와 system call  (0) 2021.09.22