리눅스를 다루면서 프로세스, 데몬에 대해 제대로 알지 못했다.
데몬이 무엇인지, 데몬과 프로세스의 차이는 무엇인 지 이번 기회에 정리하며 숙지해보도록 하겠다.
데몬
데몬이란 리눅스 시스템이 처음 가동될 때 실행되는 백그라운드 프로세스의 일종이며, 사용자의 요청을 기다리고 있다가 요청이 발생되면 이에 적절히 대응하는 리스너와 같은 역할을 한다.
사용자가 직접 제어하지 않고, 백그라운드에서 돌면서 여러 작업을 하는 프로그램이다.
보통 운영체제에서 스펠링이 "d"로 끝나는 프로레스들이 대표적이다.
inted, httpd, nfsd, sshd, named, lpd 등이 있다.
백그라운드(background) 프로세스란?
백그라운드 프로세스란, 눈에 보이지 않는 형태의 프로그램, 프로세스 등을 의미한다.
보통 '백 단에서 돌고 있다' 라는 식으로 이야기를 많이 하는데,
윈도우 운영체제를 예로 들자면, 부팅 이후 우리가 별도로 프로그램 실행을 하지 않았는데도 실시간으로 돌아가고 있는
백신 프로그램 등이 대표적인 백 단 프로세스라고 할 수 있다.
백그라운드 프로세스를 이해하기 위해서 먼저 포그라운드(foreground)에 대한 의미를 숙지하면 좋다.
포그라운드(foreground) 프로세스?
포그라운드 프로세스는 사용자와의 대화 창구인 표준입출력 장치, 터미널과 키보드(tty 혹은 pts로 표현되는)를 통해 대화한다. 사용자가 명령을 실행하고 결과를 확인할 수 있는 일반적인 방식이다.
예를 들어, 유닉스(리눅스) 운영체제가 설치되어 있는 서버에 전원을 넣고 웹 서버인 아파치 서버를 설치했다고 가정하자.
처음으로 아파치 서버를 구동하기 위해서는 아파치가 설치된 서버에 로그인을 해야 한다.
아래는 개인적으로 사용하는 서버에 ssh 접근을 진행한 것이다. 2490포트를 이용하고 있으며, 호스트 주소는 가려놓았다.
위 보는 창은 윈도우에서 사용하는 cmd창이다.
ssh 명령어를 이용하여 서버에 접근 할 때까지는 PC의 Windows에서 실행된 cmd 화면인 것을 볼 수 있다. 프롬프트가 키보드에서 명령어를 입력받고 결과를 화면에 출력하며 사용자와 실시간으로 대화하고 있다. 따라서 CMD는 포그라운드(foreground) 프로세스이다.
또한 ssh 명령 또한 화면에 sshd로부터 전달받은 내용을 표시하고 키보드를 통해 사용자가 입력한 비밀번호를 서버의 sshd에 전달하므로 포그라운드 프로세스이다.
이후 #로 표현되는 리눅스의 쉘이 표시되며 서버에 접속한 것을 알 수 있다. (보안 목적 상 서버명은 가렸다)
여기서, #이라는 쉘(;명령어를 입력받고 해석하여 커널(컴퓨터의 뇌로 이해)전달하고 명령을 실행하는 역할을 하는 친구) 을 보여주고 있는 것은 sshd가 아닌 bash 쉘이다. sshd는 우리가 알고자하는 데몬이며, 사용자에게 키보드로부터 입력을 받고 뭔가 수행을 하는 것이 아닌 백그라운드에서 도는 데몬이다.
여기서 프로세스의 관계를 살펴보자.
ps -ef 라는 명령어를 통해 현재 실행된 프로세의 목록을 살펴보자.
이제 프로세스의 관계를 살펴보자.
(중간에 root가 아닌 test2022라는 계정으로 로그인함)
맨 위를 보면 root 계정으로 실행된 sshd -D 프로세스가 보인다. 부모프로세스 아이디인 PPID는 1이며, PID는 3024이다.
3024를 PPID로 갖는 부모프로세스를 쫒아간다. root 계정으로 수행됐으며 PID가 7863인 sshd 프로세스가 보인다.
이후 7863을 부모프로세스로 갖는 test2022가 수행한 7869 PID의 sshd프로세스가 보이고, 마지막으로 7869를 부모프로세스로 갖는 7870 PID의 bash 프로세스가 보인다.
root에서 실행된 sshd(3024)가 sshd(7863)을 실행하고, 다시 해당 sshd가 test2022 계정으로 수행된 sshd(7869)를 수행했다. 그리고 마지막으로 test2022에서 실행된 bash(7870)이 bash 쉘을 실행 후 표시한다.
즉, sshd 프로세스는 사용자와 직접 대화하지 않는 백그라운드 프로세스이다. 마지막에 실행된 bash 프로세스는 사용자와 대화하기 위해 $ 프롬프트를 보여주고 키보드로부터 입력을 기다리고 있으므로, 포그라운드(foreground) 프로세스이다.
그럼 데몬 프로세스란 무엇일까?
데몬 프로세스란, 백그라운드 프로세스 중에서 부모프로세스(PPID)가 1 혹은 다른 데몬 프로세스인 프로세스를 의미한다.
따라서 위 root로 수행된 sshd(3024) 프로세스는 PPID가 1이므로 데몬이다.
그렇다면 데몬 프로세스와 일반적인 백그라운드 프로세스와 어떤 것이 다를까?
데몬프로세스는 맨 처음에 리눅스 시스템이 처음 가동될 때 실행되는 백그라운드 프로세스의 일종이라고 했다.
일반적으로 bash쉘을 통해 실행한 백그라운드 프로세스는 bash 프로세스가 종료되었을 때, 부모 프로세스가 종료되므로 자식 프로세스도 함께 종료가 되겠지만, 데몬프로세스는 그렇지 않다.
위 화면은 vim 문서편집기를 강제로 백그라운드로 실행시킨 화면이다. & 를 붙이면 백그라운드로 실행이 된다.
test2022 로 수행된 vim 프로세스의 PID는 3445, PPID는 3233이다. PID가 3233인 프로세스는 test2022로 수행된 bash 프로세스이다. 그렇다면, test2022 아이디로 접속돼있는 ssh접속을 끊는다면 어떻게 될까?
vi 프로세스는 백그라운드로 실행되었지만 데몬프로세스가 아니므로, 부모프로세스가 죽으면 함께 없어질 것이다.
위처럼 test2022계정으로 접속했던 연결을 exit 명령어를 통해 끊었을 때, Vim: Caught deadly signal TERM 이라는 내용과 함께 vim 프로세스가 함께 죽는 것을 볼 수 있다.
다른 터미널을 통해 ps -ef 명령어로 프로세스를 보면, test2022 계정으로 수행된 bash프로세스와 백그라운드로 수행되던 vim 프로세스가 모두 죽은것을 볼 수 있다.
데몬 프로세스가 되기 위해서는 부모프로세스가 1이거나 혹은 다른 데몬프로세스를 가져야한다는 말이 조금 더 이해하기 쉬워졌다.
가장 대표적인 데몬 프로세스는 웹서버 데몬이다. 웹서버 데몬 프로세스는 서버에서 터미널을 통해 실행될 수 있지만, tty 또는 pts 등 터미널을 통해 사용자와 대화할 필요가 없기 때문에, 백그라운드 프로세스로 생성하도록 만들어져 있다.
즉, 프로그램의 소스 안에서 fork() 함수를 통해 자식을 생성하고 부모는 죽는다. 그리고 생성된 자식은 부모 프로세스를 1(init)로 변경한 뒤 실제로 서비스를 수행할 자식(손자에 해당)프로세스를 여러 개 fork()한다. 그리고 그 자식(손자) 프로세스들은 계정을 setuid() 함수를 이용해 웹 서버가 실행되도록 설정된 계정으로 바꾼다.
위 과정을 보자. httpd 아파치 웹서버 서비스를 실행한 후 웹서버 프로세스를 확인해보았다.
httpd(4332)는 PPID가 1이다. 실행된 계정은 root이다. 이는 웹서버를 root 계정에서 실행시키기 때문이다. 그 이유는 TCP 1024포트 이하는 root에서만 Binding이 가능하기 때문이다.
그리고 PPID를 8064로 갖는 httpd 프로세스가 5개가 있고, 그 계정은 실행 계정이 apache임을 알 수 있다. root가 아니고 apache로 변경한 이유는 보안 상의 이유 때문이다. PPID가 1인 httpd 프로세스는 실제로 웹 브라우저의 요청을 처리하는 웹서버 데몬이 아니다. 사용자의 접속이 많아 웹 서버 데몬이 더이상 사용자의 접속 요청을 처리할 수 없을 때, 자식을 포크(fork)해주는 역할만 한다. 실제로 웹브라우저의 요청을 처리하는 웹서버 데몬은 apache 계정이 실행 계정으로 되어있는
나머지 5개의 웹서버 데몬이다.
이렇게 PPID가 1인 httpd프로세스와 PPID가 1인 프로세스를 PPID로 갖는5개의 httpd 프로세스가 바로 데몬(daemon) 프로세스이다.
이 데몬 프로세스들은 로그인한 ssh 세션에서 exit로 로그아웃하더라도 종료되지 않고 웹서비스를 제공하게 된다.
참고 링크
아래 링크의 내용이 정말 이해가 잘되어, 공부 겸 내용의 대부분을 동일하게 빌려 작성했습니다.
https://ko.wikipedia.org/wiki/%EB%8D%B0%EB%AA%AC
'운영체제 > Linux' 카테고리의 다른 글
vsftp 접근이 안될 때 ( 에러 : 500 oops vsf_sysutil_bind maximum number of attempts to find a listening port exceeded) (0) | 2022.11.14 |
---|---|
tar archive에 대해서 (tar 압축, tar압축 해제) (0) | 2022.11.08 |
wget 명령어를 이용한 파일 다운로드 (2) | 2022.09.19 |
rsync명령어에 대해서 (옵션 정리) (2) | 2022.09.16 |
xargs 명령에 대해서 (0) | 2022.09.07 |