LabHub
배우기 러닝패스 코스

LFCS — Linux Foundation認定システム管理者

ユニットファイルとスケジューリング設定を書く

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 을 넣으세요.

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