LFCS — Linux Foundation認定システム管理者
ユニットファイルとスケジューリング設定を書く
한국어 원문으로 표시합니다.
목표
systemd 유닛 파일과 타이머, 크론 파일, 로그 로테이션 설정, 드롭인 오버라이드를 문법과 섹션 규칙을 지켜 직접 쓴다.
왜 중요한가
이 실습 환경은 systemctl 이 막혀 있어 서비스를 띄울 수 없다. 그래서 채점은 전부 파일 내용으로 한다. 얼핏 손해 같지만 실제로는 시험에서 가장 많이 틀리는 지점에 정확히 집중하게 된다 — LFCS 에서 유닛 문제를 놓치는 이유는 서비스가 안 떠서가 아니라 지시어를 잘못된 섹션에 넣거나 형식을 틀려서다. WantedBy 를 [Service] 에 쓰면 활성화가 안 되고, 타이머의 WantedBy 는 multi-user.target 이 아니라 timers.target 이며, /etc/cron.d 파일에는 사용자 필드가 하나 더 들어간다. 드롭인에서 ExecStart 를 바꿀 때 빈 줄로 한 번 비우지 않으면 명령이 두 개가 되어 기동이 실패한다. 전부 파일만 보고도 잡아낼 수 있는 오류다.
단계
/root/lfcs-svc/lfcs-api.service를 만들고[Unit],[Service],[Install]세 섹션을 이 순서로 두세요.[Unit]에는 값이 비어 있지 않은Description=을 넣으세요.- 같은 파일에
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을 각각 알맞은 섹션에 채우세요. /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=oneshot과ExecStart=/usr/local/bin/lfcs-backup.sh를 넣으세요./etc/cron.d/lfcs-report를 만들고*/15 * * * * root /usr/local/bin/lfcs-report.sh로 시작하는 줄을 넣되, 출력은/var/log/lfcs-report.log로 보내세요./root/lfcs-svc/lfcsops.crontab에 사용자 crontab 형식으로30 2 * * 1-5 /usr/local/bin/lfcs-rotate.sh를 넣으세요. 이 형식에는 사용자 필드가 없습니다./etc/cron.d/lfcs-report에서 일정 줄보다 앞에SHELL=/bin/bash와PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin두 줄을 넣으세요./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 9090과MemoryMax=512M을 넣으세요.
참고
- 이 환경에서는
systemctl이 동작하지 않습니다. 채점은 파일 내용으로만 합니다. 실제 서버라면systemd-analyze verify로 문법을 보고systemctl daemon-reload로 반영합니다. StartLimitIntervalSec과StartLimitBurst는[Service]가 아니라[Unit]섹션 지시어입니다.ExecStart=에는 파이프와 리다이렉션이 통하지 않습니다. systemd 가 셸을 거치지 않고 실행하기 때문입니다.- 흔한 실수:
/etc/cron.d아래 파일 이름에 점이 들어가면 무시됩니다. 확장자를 붙이지 마세요.
유닛 파일 뼈대 만들기
/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=oneshot 과 ExecStart=/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/bash 와 PATH=/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 9090 과 MemoryMax=512M 을 넣으세요.
드롭인 디렉터리 이름은 유닛 파일 이름에 접미사가 붙은 형태입니다. 목록형 지시어는 값을 비운 줄을 먼저 두지 않으면 기존 값에 덧붙습니다.