systemd ๋ž€


systemd(system daemon)์€ Unix ์‹œ์Šคํ…œ ๋ถ€ํŒ… ํ›„ ๊ฐ€์žฅ ๋จผ์ € ์ƒ์„ฑ๋œ ํ›„ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹คํ–‰ํ•˜๋Š” init ์—ญํ• ์„ ํ•˜๋Š” ๋ฐ๋ชฌ์ด๋‹ค. RedHat ์—์„œ ๊ฐœ๋ฐœ์„ ์‹œ์ž‘ํ–ˆ๊ณ  RHEL/CentOS ์™€ Ubuntu ๋‚˜ Arch ๋“ฑ ๋Œ€๋ถ€๋ถ„์˜ ๋ฆฌ๋ˆ…์Šค ์‹œ์Šคํ…œ์— ๊ณต์‹์ ์œผ๋กœ ์ฑ„ํƒ๋˜์–ด ์‚ฌ์šฉ์ค‘์ด๋‹ค.

systemd ๋Š” PID 1๋ฒˆ์„ ๊ฐ–์œผ๋ฉฐ ๋ถ€ํŒ…๋ถ€ํ„ฐ ์„œ๋น„์Šค๊ด€๋ฆฌ, ๋กœ๊ทธ๊ด€๋ฆฌ ๋“ฑ์„ ๋‹ด๋‹นํ•œ๋‹ค. ๋ถ€ํŒ… ์‹œ ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ถ€ํŒ…์†๋„ ์—ญ์‹œ ๋น ๋ฅด๋‹ค.

๋ถ€ํŒ… ์‹œ ํ•„์š”ํ•œ ์ž‘์—…์„ systemd unit ์œผ๋กœ ๋“ฑ๋กํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํ•ด๋‹น ํŒŒ์ผ๋“ค์€ /etc/systemd/system ์— ์œ„์น˜ํ•œ๋‹ค.

Unit๊ณผ ๊ตฌ์„ฑ ์š”์†Œ


systemd Unit ํŒŒ์ผ ๊ตฌ์กฐ

[Unit]
Description=Systemd Test
 
[Service]
ExecStart=/usr/local/bin/example.sh
 
[Install]
WantedBy=multi-user.target

systemd ํŒŒ์ผ์˜ ์„น์…˜

  • Unit
    • Description: ์„œ๋น„์Šค ์„ค๋ช…
  • Service
    • ExecStart: ์„œ๋น„์Šค๋ฅผ ์‹œ์ž‘ํ•˜๊ธฐ ์œ„ํ•œ ์‹คํ–‰ํŒŒ์ผ
  • Timer
  • Install
  • โ€ฆ

Unit ํƒ€์ž…

  • service: ๋ฐ๋ชฌ/์„œ๋น„์Šค ๊ด€๋ฆฌ (.service)
  • socket: ์†Œ์ผ“ ํ™œ์„ฑํ™” (.socket)
  • timer: ์ž‘์—… ์Šค์ผ€์ค„ (.timer)
  • target: ๋ถ€ํŠธ ๋ชฉํ‘œ/๋Ÿฐ๋ ˆ๋ฒจ ์œ ์‚ฌ ๊ฐœ๋… (.target)
  • path: ํŒŒ์ผ/๋””๋ ‰ํ„ฐ๋ฆฌ ๋ณ€๊ฒฝ ๊ฐ์‹œ ํ›„ ํŠธ๋ฆฌ๊ฑฐ (.path)
  • mount/automount: ๋งˆ์šดํŠธ ๊ด€๋ฆฌ (.mount, .automount)
  • device: udev ๋””๋ฐ”์ด์Šค ์ด๋ฒคํŠธ (.device)
  • swap: ์Šค์™‘ ๊ด€๋ฆฌ (.swap)
  • slice/scope: cgroups๋กœ ๋ฆฌ์†Œ์Šค ๊ทธ๋ฃนํ™” (.slice, .scope)

์„œ๋น„์Šค ๊ด€๋ฆฌ


Service ์ฃผ์š” ์˜ต์…˜

  • Type: simple | forking | oneshot | notify | dbus | idle
    • simple(๊ธฐ๋ณธ): ExecStart ์‹คํ–‰ ํ›„ ๊ณง๋ฐ”๋กœ ํ™œ์„ฑํ™”๋กœ ๊ฐ„์ฃผ
    • forking: ๋ฐฑ๊ทธ๋ผ์šด๋“œ๋กœ ํฌํฌํ•˜๋Š” ๋ฐ๋ชฌ์— ์‚ฌ์šฉ (PIDFile ๊ถŒ์žฅ)
    • oneshot: ๋‹จ๋ฐœ์„ฑ ์ž‘์—…(์„ค์ • ์Šคํฌ๋ฆฝํŠธ) โ€” RemainAfterExit=true์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ
    • notify: systemd-notify๋กœ ์ค€๋น„ ์™„๋ฃŒ ์‹ ํ˜ธ๋ฅผ ๋ณด๋ƒ„
  • ExecStart, ExecStartPre, ExecStartPost, ExecReload, ExecStop
  • Restart: no | on-success | on-failure | on-abnormal | always ๋“ฑ
  • RestartSec: ์žฌ์‹œ์ž‘ ์ง€์—ฐ
  • User/Group: ์‹คํ–‰ ๊ณ„์ • ์ง€์ •, WorkingDirectory
  • Environment/EnvironmentFile: ํ™˜๊ฒฝ๋ณ€์ˆ˜
  • LimitNOFILE, Nice, IOSchedulingClass ๋“ฑ ๋ฆฌ์†Œ์Šค ์ œํ•œ

์˜์กด์„ฑ๊ณผ ์„ค์น˜(Install)

  • [Unit]
    • Requires=, Wants=: ๊ฐ•/์•ฝ ์˜์กด
    • After=, Before=: ์‹คํ–‰ ์ˆœ์„œ
  • [Install]
    • WantedBy=multi-user.target ๋“ฑ: enable ์‹œ ์‹ฌ๋ณผ๋ฆญ ๋งํฌ๊ฐ€ ์ƒ์„ฑ๋˜๋Š” ๋Œ€์ƒ
  • enable/disable๋Š” ๋ถ€ํŒ… ์‹œ ์ž๋™ ์‹œ์ž‘ ์—ฌ๋ถ€๋งŒ ์ œ์–ด, start/stop์€ ์ฆ‰์‹œ ์‹คํ–‰ ์ œ์–ด

๋ถ€ํŒ…๊ณผ Target


Target (๋Ÿฐ๋ ˆ๋ฒจ ๋งคํ•‘)

  • graphical.target โ‰ˆ runlevel5, multi-user.target โ‰ˆ runlevel3, rescue.target โ‰ˆ runlevel1
  • ๊ธฐ๋ณธ ํƒ€๊นƒ ํ™•์ธ/์„ค์ •: systemctl get-default, systemctl set-default multi-user.target

์šด์˜ ๋ช…๋ น์–ด


์ž์ฃผ ์“ฐ๋Š” systemctl

  • ์ƒํƒœ/์ œ์–ด
    • systemctl status <unit>
    • systemctl start|stop|restart <unit>
    • systemctl enable|disable <unit>
    • systemctl daemon-reload (์œ ๋‹› ํŒŒ์ผ ์ˆ˜์ • ํ›„)
  • ๋‚˜์—ด/๊ฒ€์ƒ‰
    • systemctl list-units --type=service
    • systemctl list-unit-files --type=service

journalctl (๋กœ๊ทธ)

  • journalctl -u <service>: ์„œ๋น„์Šค ๋กœ๊ทธ
  • journalctl -u <service> -f: ์‹ค์‹œ๊ฐ„ ํŒ”๋กœ์šฐ
  • journalctl -b: ํ˜„์žฌ ๋ถ€ํŒ… ์‚ฌ์ดํด ๋กœ๊ทธ
  • -p info|warning|err, --since "2025-09-17 09:00"

์Šค์ผ€์ค„๋ง๊ณผ ํ™œ์„ฑํ™”


Timer vs cron

  • .timer ์œ ๋‹›์œผ๋กœ ์Šค์ผ€์ค„ ์ •์˜, .service ์‹คํ–‰์„ ํŠธ๋ฆฌ๊ฑฐ
  • ๋ชจ๋“œ: OnCalendar= (์บ˜๋ฆฐ๋”), OnBootSec=/OnUnitActiveSec= (์ƒ๋Œ€์‹œ๊ฐ„)
  • ์žฅ์ : ์œ ๋‹› ์˜์กด์„ฑ, ๋กœ๊น…(journal), ์‹คํŒจ ์‹œ Restart ์ •์ฑ…๊ณผ ํ†ตํ•ฉ

์˜ˆ์‹œ (.timer):

[Unit]
Description=DB ๋ฐฑ์—… ํƒ€์ด๋จธ
 
[Timer]
OnCalendar=*-*-* 03:00:00
Persistent=true
 
[Install]
WantedBy=timers.target

์˜ˆ์‹œ (.service):

[Unit]
Description=DB ๋ฐฑ์—… ์‹คํ–‰
 
[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup.sh

์†Œ์ผ“/ํŒจ์Šค ํ™œ์„ฑํ™”

  • socket: ํฌํŠธ/์†Œ์ผ“ ์ ‘๊ทผ์ด ์žˆ์„ ๋•Œ ๊ด€๋ จ .service๋ฅผ ์ง€์—ฐ ๊ธฐ๋™
  • path: ํŒŒ์ผ ์ƒ์„ฑ/๋ณ€๊ฒฝ ์‹œ .service ํŠธ๋ฆฌ๊ฑฐ (PathChanged=, PathExists= ๋“ฑ)

๋ฆฌ์†Œ์Šค ์ œ์–ด


cgroups์™€ ๋ฆฌ์†Œ์Šค ์ œ์–ด

  • systemd๋Š” cgroups์„ ํ†ตํ•ด ๊ฐ ์œ ๋‹› ๋ฆฌ์†Œ์Šค๋ฅผ ์ถ”์ /์ œํ•œ
  • CPUAccounting=, MemoryMax=, IPAddressDeny=/Allow= ๋“ฑ์œผ๋กœ ์ œ์–ด ๊ฐ€๋Šฅ (๋ฒ„์ „ ์˜์กด)

ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…


  • ์œ ๋‹› ํŒŒ์ผ ๋ณ€๊ฒฝ ํ›„ systemctl daemon-reload
  • ๊ถŒํ•œ/๊ฒฝ๋กœ ํ™•์ธ: ExecStart ๊ฒฝ๋กœ, ์‹คํ–‰๊ถŒํ•œ, WorkingDirectory
  • ํ™˜๊ฒฝ ๋ณ€์ˆ˜: EnvironmentFile ๊ฒฝ๋กœ/๊ถŒํ•œ
  • SELinux/AppArmor ์ •์ฑ…์œผ๋กœ ์ธํ•œ ๊ฑฐ๋ถ€ ์—ฌ๋ถ€ ํ™•์ธ
  • ๋ถ€ํŒ… ์‹œ ์‹คํŒจ: systemctl --failed, journalctl -b -p err