LabHub
배우기 러닝패스 코스

LFCS — Linux Foundation System Administrator

Writing Unit Files and Scheduling Configuration

LabHub 에서 이어서 보기

한국어 원문으로 표시합니다.

목표

systemd 유닛 파일과 타이머, 크론 파일, 로그 로테이션 설정, 드롭인 오버라이드를 문법과 섹션 규칙을 지켜 직접 쓴다.

왜 중요한가

이 실습 환경은 systemctl 이 막혀 있어 서비스를 띄울 수 없다. 그래서 채점은 전부 파일 내용으로 한다. 얼핏 손해 같지만 실제로는 시험에서 가장 많이 틀리는 지점에 정확히 집중하게 된다 — LFCS 에서 유닛 문제를 놓치는 이유는 서비스가 안 떠서가 아니라 지시어를 잘못된 섹션에 넣거나 형식을 틀려서다. WantedBy[Service] 에 쓰면 활성화가 안 되고, 타이머의 WantedBymulti-user.target 이 아니라 timers.target 이며, /etc/cron.d 파일에는 사용자 필드가 하나 더 들어간다. 드롭인에서 ExecStart 를 바꿀 때 빈 줄로 한 번 비우지 않으면 명령이 두 개가 되어 기동이 실패한다. 전부 파일만 보고도 잡아낼 수 있는 오류다.

단계

  1. /root/lfcs-svc/lfcs-api.service 를 만들고 [Unit], [Service], [Install] 세 섹션을 이 순서로 두세요. [Unit] 에는 값이 비어 있지 않은 Description= 을 넣으세요.
  2. 같은 파일에 After=network-online.target, Wants=network-online.target, Type=simple, ExecStart=/usr/local/bin/lfcs-api --port 8080, Restart=on-failure, RestartSec=5, User=lfcsapi, WantedBy=multi-user.target 을 각각 알맞은 섹션에 채우세요.
  3. /root/lfcs-svc/lfcs-backup.timer[Timer] 섹션과 OnCalendar=*-*-* 03:30:00, Persistent=true, Unit=lfcs-backup.service 를 넣고 WantedBy=timers.target 으로 활성화하세요. 짝이 되는 /root/lfcs-svc/lfcs-backup.service 에는 Type=oneshotExecStart=/usr/local/bin/lfcs-backup.sh 를 넣으세요.
  4. /etc/cron.d/lfcs-report 를 만들고 */15 * * * * root /usr/local/bin/lfcs-report.sh 로 시작하는 줄을 넣되, 출력은 /var/log/lfcs-report.log 로 보내세요.
  5. /root/lfcs-svc/lfcsops.crontab 에 사용자 crontab 형식으로 30 2 * * 1-5 /usr/local/bin/lfcs-rotate.sh 를 넣으세요. 이 형식에는 사용자 필드가 없습니다.
  6. /etc/cron.d/lfcs-report 에서 일정 줄보다 앞에 SHELL=/bin/bashPATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin 두 줄을 넣으세요.
  7. /root/lfcs-svc/lfcs-report.logrotate/var/log/lfcs-report.log 블록을 만들고 daily, rotate 14, compress, delaycompress, missingok, notifempty, create 0640 root adm 을 넣으세요.
  8. /root/lfcs-svc/lfcs-api.service.d/override.conf 를 만들어 [Service] 아래에 값이 빈 ExecStart= 를 먼저 두고, 이어서 ExecStart=/usr/local/bin/lfcs-api --port 9090MemoryMax=512M 을 넣으세요.

참고

유닛 파일 뼈대 만들기

/root/lfcs-svc/lfcs-api.service 를 만들고 [Unit], [Service], [Install] 세 섹션을 이 순서로 두세요. [Unit] 에는 값이 비어 있지 않은 Description= 을 넣으세요.

유닛 파일은 INI 형식이고 섹션 이름은 대괄호로 감쌉니다. 세 섹션의 순서와 대소문자를 정확히 맞추세요.

실행·재시작·활성화 지시어

같은 파일에 After=network-online.target, Wants=network-online.target, Type=simple, ExecStart=/usr/local/bin/lfcs-api --port 8080, Restart=on-failure, RestartSec=5, User=lfcsapi, WantedBy=multi-user.target 을 각각 알맞은 섹션에 채우세요.

각 지시어는 어느 섹션에 속하는지가 정해져 있습니다. 활성화 대상은 [Install] 에, 실행 방식은 [Service] 에, 순서 의존은 [Unit] 에 들어갑니다.

타이머 유닛과 짝 서비스

/root/lfcs-svc/lfcs-backup.timer[Timer] 섹션과 OnCalendar=*-*-* 03:30:00, Persistent=true, Unit=lfcs-backup.service 를 넣고 WantedBy=timers.target 으로 활성화하세요. 짝이 되는 /root/lfcs-svc/lfcs-backup.service 에는 Type=oneshotExecStart=/usr/local/bin/lfcs-backup.sh 를 넣으세요.

타이머는 스스로 일하지 않고 같은 이름의 유닛을 깨웁니다. 꺼져 있던 동안 지나간 실행을 따라잡게 하는 지시어가 따로 있습니다.

/etc/cron.d 파일 작성

/etc/cron.d/lfcs-report 를 만들고 */15 * * * * root /usr/local/bin/lfcs-report.sh 로 시작하는 줄을 넣되, 출력은 /var/log/lfcs-report.log 로 보내세요.

시스템 크론 파일은 시간 5필드 뒤에 실행 사용자 필드가 하나 더 들어갑니다. 출력을 남기지 않으면 cron 이 메일로 보내려 합니다.

사용자 crontab 형식

/root/lfcs-svc/lfcsops.crontab 에 사용자 crontab 형식으로 30 2 * * 1-5 /usr/local/bin/lfcs-rotate.sh 를 넣으세요. 이 형식에는 사용자 필드가 없습니다.

사용자 crontab 에는 사용자 필드가 없습니다. 요일 필드에서 범위는 하이픈으로 씁니다.

cron 의 PATH 문제

/etc/cron.d/lfcs-report 에서 일정 줄보다 앞에 SHELL=/bin/bashPATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin 두 줄을 넣으세요.

환경 변수 줄은 일정 줄보다 앞에 있어야 적용됩니다. cron 이 기본으로 주는 PATH 는 로그인 셸의 것보다 훨씬 짧다는 점이 이 단계의 이유입니다.

로그 로테이션 설정

/root/lfcs-svc/lfcs-report.logrotate/var/log/lfcs-report.log 블록을 만들고 daily, rotate 14, compress, delaycompress, missingok, notifempty, create 0640 root adm 을 넣으세요.

대상 경로 뒤에 중괄호 블록을 열고 지시어를 한 줄씩 넣습니다. 회전 직후 만들 새 파일의 권한과 소유권을 지정하는 지시어가 있습니다.

드롭인 오버라이드

/root/lfcs-svc/lfcs-api.service.d/override.conf 를 만들어 [Service] 아래에 값이 빈 ExecStart= 를 먼저 두고, 이어서 ExecStart=/usr/local/bin/lfcs-api --port 9090MemoryMax=512M 을 넣으세요.

드롭인 디렉터리 이름은 유닛 파일 이름에 접미사가 붙은 형태입니다. 목록형 지시어는 값을 비운 줄을 먼저 두지 않으면 기존 값에 덧붙습니다.