LFCS — Linux Foundation System Administrator
Writing Unit Files and Scheduling Configuration
한국어 원문으로 표시합니다.
목표
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 을 넣으세요.
드롭인 디렉터리 이름은 유닛 파일 이름에 접미사가 붙은 형태입니다. 목록형 지시어는 값을 비운 줄을 먼저 두지 않으면 기존 값에 덧붙습니다.