개요

systemd는 현대 Linux 시스템의 핵심 init 시스템으로, 단순한 서비스 관리를 넘어 타이머, 소켓 활성화, 리소스 제어 등 강력한 기능을 제공합니다. 그러나 많은 관리자들이 systemctl start/stop 수준에서만 활용하고 있습니다. 이 글에서는 systemd의 고급 기능인 커스텀 서비스 유닛 작성, 타이머를 이용한 cron 대체, 리소스 제한 등을 실전 예제와 함께 다룹니다.

핵심 개념

유닛(Unit): systemd가 관리하는 최소 단위입니다. 서비스(.service), 타이머(.timer), 소켓(.socket), 마운트(.mount) 등 다양한 타입이 있습니다.

의존성 관리: After, Requires, Wants 등의 디렉티브로 유닛 간 시작 순서와 의존관계를 정의합니다. After는 순서만 지정하고, Requires는 의존 유닛이 실패하면 함께 중단됩니다.

타이머(Timer): cron을 대체하는 systemd의 스케줄링 기능입니다. OnCalendar로 특정 시간을, OnBootSec/OnUnitActiveSec으로 상대 시간을 지정할 수 있습니다. cron 대비 로깅, 의존성, 리소스 제한 등에서 우위가 있습니다.

리소스 제어: cgroups v2를 기반으로 CPU, 메모리, I/O를 유닛 단위로 제한할 수 있습니다. 이는 특정 서비스가 시스템 전체에 영향을 미치는 것을 방지합니다.

실전 예제

커스텀 서비스 유닛을 만들고 타이머로 주기적으로 실행하는 예제입니다.

# 백업 스크립트 생성
sudo tee /usr/local/bin/db-backup.sh <<'EOF'
#!/bin/bash
BACKUP_DIR="/var/backups/db"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
mkdir -p "$BACKUP_DIR"
pg_dump mydb | gzip > "$BACKUP_DIR/mydb_$TIMESTAMP.sql.gz"
find "$BACKUP_DIR" -name "*.gz" -mtime +7 -delete
echo "Backup completed: mydb_$TIMESTAMP.sql.gz"
EOF
sudo chmod +x /usr/local/bin/db-backup.sh
# 서비스 유닛 생성: /etc/systemd/system/db-backup.service
sudo tee /etc/systemd/system/db-backup.service <<EOF
[Unit]
Description=Database Backup Service
After=postgresql.service
Requires=postgresql.service

[Service]
Type=oneshot
ExecStart=/usr/local/bin/db-backup.sh
User=postgres
Group=postgres

# 리소스 제한
MemoryMax=512M
CPUQuota=50%
IOWeight=50

# 보안 강화
ProtectSystem=strict
ReadWritePaths=/var/backups/db
PrivateTmp=true
NoNewPrivileges=true
EOF
# 타이머 유닛 생성: /etc/systemd/system/db-backup.timer
sudo tee /etc/systemd/system/db-backup.timer <<EOF
[Unit]
Description=Run DB Backup Daily

[Timer]
OnCalendar=*-*-* 02:00:00
RandomizedDelaySec=600
Persistent=true

[Install]
WantedBy=timers.target
EOF

# 타이머 활성화 및 시작
sudo systemctl daemon-reload
sudo systemctl enable --now db-backup.timer

# 타이머 상태 확인
systemctl list-timers --all | grep db-backup

# 수동 실행 테스트
sudo systemctl start db-backup.service
journalctl -u db-backup.service --no-pager -n 20

활용 팁

  • Persistent=true: 시스템이 꺼져 있는 동안 놓친 실행을 부팅 시 즉시 실행합니다. 백업이나 정기 작업에 필수적입니다.
  • RandomizedDelaySec: 여러 타이머가 동시에 실행되는 것을 방지합니다. 서버 부하 분산에 효과적입니다.
  • 보안 디렉티브 활용: ProtectSystem, PrivateTmp, NoNewPrivileges 등을 적극 사용하면 서비스 격리가 강화됩니다.
  • journalctl 활용: journalctl -u 서비스명 --since today로 오늘의 로그를, -f 옵션으로 실시간 로그를 확인하세요.
  • systemd-analyze: systemd-analyze blame으로 부팅 시간을 분석하고, 느린 서비스를 식별하여 최적화할 수 있습니다.

마무리

systemd의 고급 기능을 활용하면 cron보다 안정적인 스케줄링, 세밀한 리소스 관리, 강화된 보안 격리를 구현할 수 있습니다. 특히 커스텀 서비스와 타이머 조합은 운영 자동화의 기본 빌딩 블록으로, 한번 익혀두면 서버 관리 효율이 크게 향상됩니다.