데몬(daemon)
데몬(daemon)은 사용자가 직접적으로 제어하지 않고, 백그라운드에서 돌면서 여러 작업을 하는 프로그램이다. 서비스는 주로 서버/클라이언트 모델에서 출발하여, 사용자의 요청에 응답하는 프로그램으로 주로 데몬 형태로 구동된다. 우리가 실행하는 프로그램이 프로세스로 생성되어 동작하는데 그 형태에 따라서 서비스나 데몬 형태로 실행된다.
웹서버나 파일서버는 데몬 형태로 구동되는 서비스 프로그램이다. 반면에 시스템 로깅이나 프린터와 네트워크는 일반적으로 사용자 interaction이 필요없이 백그라운드에서 조용히 자기 할 일을 수행하는 데몬이다.
- 웹서버 - httpd
- 파일서버 - ftpd
- 웹프록시 - squid
- 시큐어쉘(원격터미널) - sshd
- 시스템로깅 - syslogd, rsyslogd
- 프린터데몬 - cupsd, lpd
- 네트워크서비스 - inetd, xinetd
우분투 데몬
systemd 를 사용하는 우분투의 systemctl 을 통해 서비스를 확인할 수 있다.
$ systemctl status
$ systemctl status <daemon-name>
$ systemctl start <daemon-name>
$ systemctl stop <daemon-name>
$ systemctl restart <daemon-name>
systemd라는 데몬은 우리가 사용하는 모든 데몬들을 관리한다. 시스템의 커널 부팅이 끝나고 유저 프로세스 모드로 들어와서 제일 처음 시작되는 systemd가 다양한 다른 프로세스들을 실행시킨다. systemd는 프로세스를 자동으로 병렬로 실행한다. systemd를 관리하기 위해 systemctl이라는 명령어가 있고, 각종 프로세스들을 모니터링하는 journalctl이라는 명령어가 있다.
Systemd 디렉토리는 /lib/systemd/에 존재하고, /lib/systemd/system안에는 다양한 서비스들의 목록과 실행규칙들에 대한 서비스 설정 파일들이 존재한다. 서비스가 활성화 되었을 때는 심볼릭 링크가 /etc/systemd/system/*.service
에 생성되면서 부팅 과정에서 호출되게 된다.
systemd에는 service, socket, device, mount, automount, swap, target, path, timer, slice, scope 등등 다양한 종류의 유닛들이 등록될 수 있다.
systemd의 부팅 순서를 보면 가장 처음 시작되는 프로세스 인것을 확인할 수 있다.
이 systemd를 통해서 /lib/systemd/system/ 안에 있는 다양한 서비스들을 시작한다. 여기는 구동하는 시스템 목록의 대상들이 들어있는 것이고, 일반적으로 대부분의 서비스들은 /etc/systemd/system/에 있는 파일을 이용해서 호출된다. symbolic link를 통해서 lib안에 있는 파일들을 호출해주는 것을 볼 수있다.
시스템 컨트롤 명령어
Systemctl 명령어를 통해 다양한 데몬/서비스를 확인할 수 있다.
- systemctl list-units: 유닛별로 실행 중인 서비스 목록 확인
- systemctl list-units –type=service –state=running (상태=failed, active, running)
- systemctl status
.service: 서비스 상태 확인 - systemctl start
.service: 서비스 시작 - systemctl stop
.service: 서비스 중지 - systemctl restart
.service: 서비스 재시작 - systemctl reload
.service: 설정 파일 재로드 - systemctl enable
service: 부팅시 서비스 자동 시작 - systemctl disable
.service: 부팅시 서비스 자동 시작 삭제 - systemctl mask
.service: 서비스 숨기기 (시작불가) - systemctl unmask
.service: 서비스 숨기기 제거
systemctl get-default를 보면 기본적으로 graphical.target을 호출해서 다양한 서비스들을 부팅하는 것을 볼 수 잇다. 이것에 대한 구현체는 /etc/systemd/system/default.target에 있다.
우리가 바꿀 수 있는 타겟은 아래와 같이 확인할 수 있다.
만약에 우분투 시스템이 부팅될 때 GUI가 있는것을 원하지 않으면 아래와 같이 바꾸면 되고 symbolic link가 변경되는 것을 볼 수 있다. 이제 재부팅을 하면 GUI 환경이 아닌 text로 된 terminal 환경으로 바로 접속 될 것이다.
서비스 데몬의 로그 확인
Journalctl 을 통해 다양한 데몬/서비스 로그를 확인할 수 있다.
- journalctl (전체로그)
- journalctl -b (부팅후로그)
- journalctl -f (최근로그 및 이후 로그 트래킹 대기)
- journalctl -u
: 특정 서비스의 로그 확인 - journalctl -p crit (크리티컬 속성의 로그 확인): 특정 이벤트 속성 조회하기
- journalctl -u
--since=2020-06-01 --until=today: 특정 날짜로 조회하기 - journalctl –disk-usage: 로그의 크기 확인
일반 시스템 로그 파일은 용량이 커지지 않도록 관리가 되지만, 데몬 프로세스의 로그는 시스템을 재부팅 하지 않는한 계속 쌓이는 특징이 있다. 그래서 /var/log/journal에 있는 로그를 수동으로 지워야 할 수도 있다.
서비스 만들기
- systemctl cat
.service: 기존 서비스 명령어의 설정파일 살펴보기 - systemctl edit –full
.service: 서비스 명령파일 수정하기 - systemctl daemon-reload: 새로운 데몬 서비스가 생성된 경우 그 라이브러리 목록 재 갱신
원하는 프로세스 서비스를 등록하는 방법을 알아본다.
- 실행될 데몬 서비스 만들기
- 서비스 파일 만들기
[Service]는 이 서비스가 어떻게 실행이 될것인지, [Install]은 부팅때 설치를 하고 싶기 때문에 multi-user.target에 등록시켜준다.
- 실행
확인해보면 아직 돌고 있지 않는 상태로 만들어진다.
enable을 하면 symbolic 링크가 생긴다.
이제 직접 수동으로 실행해본다. 하지만 fail 되는데 실행권한이 없기 때문에 fail 된것을 log로 확인할 수 있다.
그래서 permission을 주고 다시 실행한다.
실행은 되는데 초록불이 되지는 않는다. 그 이유는 start는 일회성으로 실행되고 종료된느 것이지 데몬 형태로는 돌고 있지 않기 때문이다. 정상적으로 동작이 되었으면 /tmp/mylog.log가 만들어져야 한다.