LFCS — 리눅스 재단 시스템 관리자 · 실행 중인 시스템 운영 · 실습
유닛 파일과 스케줄링 설정 쓰기
목표
systemd 유닛 파일과 타이머, 크론 파일, 로그 로테이션 설정, 드롭인 오버라이드를 문법과 섹션 규칙을 지켜 직접 쓴다.
왜 중요한가
이 실습 환경은 systemctl 이 막혀 있어 서비스를 띄울 수 없다. 그래서 채점은 전부 파일 내용으로 한다. 얼핏 손해 같지만 실제로는 시험에서 가장 많이 틀리는 지점에 정확히 집중하게 된다 — LFCS 에서 유닛 문제를 놓치는 이유는 서비스가 안 떠서가 아니라 지시어를 잘못된 섹션에 넣거나 형식을 틀려서다. WantedBy 를 [Service] 에 쓰면 활성화가 안 되고, 타이머의 WantedBy 는 multi-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=oneshot 과 ExecStart=/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/bash 와 PATH=/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 9090 과 MemoryMax=512M 을 넣으세요.
참고
- 이 환경에서는
systemctl이 동작하지 않습니다. 채점은 파일 내용으로만 합니다. 실제 서버라면systemd-analyze verify로 문법을 보고systemctl daemon-reload로 반영합니다. StartLimitIntervalSec과StartLimitBurst는[Service]가 아니라[Unit]섹션 지시어입니다.ExecStart=에는 파이프와 리다이렉션이 통하지 않습니다. systemd 가 셸을 거치지 않고 실행하기 때문입니다.- 흔한 실수:
/etc/cron.d아래 파일 이름에 점이 들어가면 무시됩니다. 확장자를 붙이지 마세요.
단계 8개
- 유닛 파일 뼈대 만들기
- 실행·재시작·활성화 지시어
- 타이머 유닛과 짝 서비스
- /etc/cron.d 파일 작성
- 사용자 crontab 형식
- cron 의 PATH 문제
- 로그 로테이션 설정
- 드롭인 오버라이드