13. systemd μ¬ν
13. systemd μ¬ν¶
νμ΅ λͺ©ν¶
- systemd μν€ν μ²μ λμ μ리 μ΄ν΄
- 컀μ€ν μλΉμ€ μ λ μμ±
- νμ΄λ¨Έ μ λμΌλ‘ μ€μΌμ€λ§
- μμΌ νμ±νμ μμ‘΄μ± κ΄λ¦¬
λͺ©μ°¨¶
- systemd μν€ν μ²
- μλΉμ€ μ λ μμ±
- νμ΄λ¨Έ μ λ
- μμΌ νμ±ν
- μμ‘΄μ±κ³Ό μμ
- journald λ‘κΉ
- μ°μ΅ λ¬Έμ
1. systemd μν€ν μ²¶
1.1 systemd κ°μ¶
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β systemd μν€ν
μ² β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β systemd (PID 1) β β
β β β’ μμ€ν
μ΄κΈ°ν λ° μλΉμ€ κ΄λ¦¬ β β
β β β’ λ³λ ¬ μλΉμ€ μμ β β
β β β’ μμΌ/D-Bus νμ±ν β β
β β β’ cgroups κΈ°λ° λ¦¬μμ€ κ΄λ¦¬ β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β
β ββββββββΌβββββββββββββββββββββββββββββββ β
β β β β β
β βΌ βΌ βΌ β
β ββββββββ ββββββββ ββββββββ ββββββββ ββββββββ β
β βudevd β βlogindβ βjournaldβ βnetworkdβ βresolvedβ β
β ββββββββ ββββββββ ββββββββ ββββββββ ββββββββ β
β β
β μ λ νμ
: β
β β’ .service - μλΉμ€/λ°λͺ¬ β
β β’ .socket - μμΌ β
β β’ .timer - νμ΄λ¨Έ (cron λ체) β
β β’ .target - κ·Έλ£Ή (λ°λ 벨 λ체) β
β β’ .mount - λ§μ΄νΈ ν¬μΈνΈ β
β β’ .device - μ₯μΉ β
β β’ .path - κ²½λ‘ λͺ¨λν°λ§ β
β β’ .slice - 리μμ€ κ·Έλ£Ή β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
1.2 μ λ νμΌ μμΉ¶
# μ λ νμΌ μμΉ (μ°μ μμ μ)
/etc/systemd/system/ # μμ€ν
κ΄λ¦¬μ μ€μ (μ΅μ°μ )
/run/systemd/system/ # λ°νμ μμ± μ λ
/usr/lib/systemd/system/ # ν¨ν€μ§ μ€μΉ μ λ
# μ¬μ©μ μ λ
~/.config/systemd/user/ # μ¬μ©μ μ€μ
/etc/systemd/user/ # μ μ μ¬μ©μ μ€μ
/usr/lib/systemd/user/ # ν¨ν€μ§ μ€μΉ μ¬μ©μ μ λ
# μ λ νμΌ μμΉ νμΈ
systemctl show -p FragmentPath nginx.service
systemctl cat nginx.service
1.3 κΈ°λ³Έ systemctl λͺ λ Ή¶
# μλΉμ€ κ΄λ¦¬
systemctl start nginx
systemctl stop nginx
systemctl restart nginx
systemctl reload nginx # μ€μ λ§ λ¦¬λ‘λ
systemctl status nginx
# λΆν
μ μλ μμ
systemctl enable nginx
systemctl disable nginx
systemctl is-enabled nginx
# μλΉμ€ λ§μ€νΉ (μμ μμ λ°©μ§)
systemctl mask nginx
systemctl unmask nginx
# μ λ λͺ©λ‘
systemctl list-units
systemctl list-units --type=service
systemctl list-units --state=failed
# μ λ νμΌ λͺ©λ‘
systemctl list-unit-files
# μμ‘΄μ± νμΈ
systemctl list-dependencies nginx.service
systemctl list-dependencies --reverse nginx.service
# λ°λͺ¬ 리λ‘λ (μ λ νμΌ μμ ν)
systemctl daemon-reload
2. μλΉμ€ μ λ μμ±¶
2.1 κΈ°λ³Έ μλΉμ€ μ λ¶
# /etc/systemd/system/myapp.service
[Unit]
Description=My Application Service
Documentation=https://myapp.example.com/docs
After=network.target
Wants=network-online.target
[Service]
Type=simple
User=myapp
Group=myapp
WorkingDirectory=/opt/myapp
ExecStart=/opt/myapp/bin/myapp --config /etc/myapp/config.yaml
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
RestartSec=5
# νκ²½ λ³μ
Environment=NODE_ENV=production
EnvironmentFile=-/etc/myapp/env # - λ νμΌ μμ΄λ μλ¬ μ λ¨
# λ‘κΉ
StandardOutput=journal
StandardError=journal
SyslogIdentifier=myapp
[Install]
WantedBy=multi-user.target
2.2 μλΉμ€ Type¶
# Type=simple (κΈ°λ³Έκ°)
# νλ‘μΈμ€κ° λ°λ‘ λ©μΈ νλ‘μΈμ€
[Service]
Type=simple
ExecStart=/usr/bin/myapp
# Type=forking
# νλ‘μΈμ€κ° forkνκ³ λΆλͺ¨κ° μ’
λ£
[Service]
Type=forking
PIDFile=/var/run/myapp.pid
ExecStart=/usr/bin/myapp --daemon
# Type=oneshot
# μμ ν μ’
λ£λλ μΌνμ± μμ
[Service]
Type=oneshot
ExecStart=/usr/local/bin/setup-script.sh
RemainAfterExit=yes # μ’
λ£ νμλ active μν μ μ§
# Type=notify
# νλ‘μΈμ€κ° sd_notify()λ‘ μ€λΉ μλ£ μλ¦Ό
[Service]
Type=notify
ExecStart=/usr/bin/myapp-with-notify
# Type=dbus
# D-Bus μ΄λ¦ νλ μ μ€λΉ μλ£
[Service]
Type=dbus
BusName=org.example.MyApp
ExecStart=/usr/bin/myapp
# Type=idle
# λ€λ₯Έ μμ
μλ£ ν μ€ν (λΆν
λ©μμ§ μΆλ ₯ λ±)
[Service]
Type=idle
ExecStart=/usr/bin/welcome-message
2.3 Exec μ΅μ ¶
[Service]
# μμ/μ’
λ£ λͺ
λ Ή
ExecStartPre=/usr/bin/myapp-check # μμ μ μ€ν
ExecStart=/usr/bin/myapp # λ©μΈ λͺ
λ Ή
ExecStartPost=/usr/bin/myapp-notify # μμ ν μ€ν
ExecReload=/bin/kill -HUP $MAINPID # reload μ μ€ν
ExecStop=/usr/bin/myapp stop # μ’
λ£ λͺ
λ Ή
ExecStopPost=/usr/bin/cleanup # μ’
λ£ ν μ€ν
# μ€ν¨ν΄λ κ³μ (-μ λμ¬)
ExecStartPre=-/usr/bin/optional-check
# μ μ¬μ© (;λ μ¬λ¬ λͺ
λ Ή)
ExecStart=/bin/sh -c 'echo start && /usr/bin/myapp'
# νμμμ
TimeoutStartSec=30
TimeoutStopSec=30
TimeoutSec=30 # λ λ€ μ€μ
# μ¬μμ 쑰건
Restart=no # μ¬μμ μ ν¨
Restart=on-success # μ μ μ’
λ£ μλ§
Restart=on-failure # λΉμ μ μ’
λ£ μλ§
Restart=on-abnormal # μκ·Έλ/νμμμ μ
Restart=on-watchdog # watchdog νμμμ μ
Restart=on-abort # μΊμΉ μ λ μκ·Έλ μ
Restart=always # νμ μ¬μμ
RestartSec=5 # μ¬μμ μ λκΈ° μκ°
RestartPreventExitStatus=1 23 # μ΄ μ’
λ£μ½λλ©΄ μ¬μμ μ ν¨
2.4 보μ μ΅μ ¶
[Service]
# μ¬μ©μ/κ·Έλ£Ή
User=myapp
Group=myapp
DynamicUser=yes # λμ μ¬μ©μ μμ± (μμ)
# νμΌμμ€ν
μ κ·Ό μ ν
ProtectSystem=strict # /usr, /boot μ½κΈ° μ μ©
ProtectHome=yes # /home μ κ·Ό λΆκ°
PrivateTmp=yes # 격리λ /tmp
ReadWritePaths=/var/lib/myapp
ReadOnlyPaths=/etc/myapp
# λ€νΈμν¬ μ ν
PrivateNetwork=yes # 격리λ λ€νΈμν¬
RestrictAddressFamilies=AF_INET AF_INET6
# μμ€ν
μ½ νν°λ§
SystemCallFilter=@system-service
SystemCallFilter=~@privileged @resources
# κΈ°ν 보μ
NoNewPrivileges=yes
ProtectKernelTunables=yes
ProtectKernelModules=yes
ProtectControlGroups=yes
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
AmbientCapabilities=CAP_NET_BIND_SERVICE
# 리μμ€ μ ν
LimitNOFILE=65536
LimitNPROC=4096
MemoryMax=1G
CPUQuota=50%
2.5 μμ ν μμ : Node.js μ±¶
# /etc/systemd/system/nodeapp.service
[Unit]
Description=Node.js Application
Documentation=https://example.com/docs
After=network.target mongodb.service
Wants=mongodb.service
[Service]
Type=simple
User=nodeapp
Group=nodeapp
WorkingDirectory=/opt/nodeapp
# Node.js κ²½λ‘
Environment=PATH=/opt/nodeapp/node/bin:/usr/bin
Environment=NODE_ENV=production
EnvironmentFile=/etc/nodeapp/env
# μ€ν
ExecStart=/opt/nodeapp/node/bin/node /opt/nodeapp/app.js
ExecReload=/bin/kill -HUP $MAINPID
# μ¬μμ μ μ±
Restart=always
RestartSec=10
WatchdogSec=30
# λ‘κΉ
StandardOutput=journal
StandardError=journal
SyslogIdentifier=nodeapp
# 보μ
NoNewPrivileges=yes
ProtectSystem=strict
ProtectHome=yes
PrivateTmp=yes
ReadWritePaths=/var/lib/nodeapp /var/log/nodeapp
# 리μμ€ μ ν
LimitNOFILE=65536
MemoryMax=2G
[Install]
WantedBy=multi-user.target
3. νμ΄λ¨Έ μ λ¶
3.1 νμ΄λ¨Έ κΈ°λ³Έ¶
# /etc/systemd/system/backup.timer
[Unit]
Description=Daily Backup Timer
[Timer]
# μ€μκ° (wallclock) νμ΄λ¨Έ
OnCalendar=*-*-* 02:00:00 # λ§€μΌ μλ²½ 2μ
# λλ λͺ¨λ
Έν λ νμ΄λ¨Έ
# OnBootSec=15min # λΆν
15λΆ ν
# OnUnitActiveSec=1h # λ§μ§λ§ νμ±ν ν 1μκ°
# μ νλ (λ°°ν°λ¦¬ μ μ½)
AccuracySec=1min
# λμΉ μ€ν μ²λ¦¬
Persistent=yes # μμ€ν
κΊΌμ Έμλ λμ λμΉ μ€ν 보μ
[Install]
WantedBy=timers.target
---
# /etc/systemd/system/backup.service
[Unit]
Description=Backup Service
[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup.sh
3.2 OnCalendar λ¬Έλ²¶
# OnCalendar νμ: DayOfWeek Year-Month-Day Hour:Minute:Second
# λ§€μΌ μμ
OnCalendar=daily
OnCalendar=*-*-* 00:00:00
# λ§€μκ°
OnCalendar=hourly
OnCalendar=*-*-* *:00:00
# λ§€μ£Ό μμμΌ μ€μ 6μ
OnCalendar=Mon *-*-* 06:00:00
OnCalendar=weekly
# λ§€μ 1μΌ
OnCalendar=monthly
OnCalendar=*-*-01 00:00:00
# λ§€λ
1μ 1μΌ
OnCalendar=yearly
OnCalendar=*-01-01 00:00:00
# 5λΆλ§λ€
OnCalendar=*:0/5
OnCalendar=*-*-* *:00/5:00
# νμΌ μ€μ 9μ
OnCalendar=Mon..Fri *-*-* 09:00:00
# νΉμ λ μ§
OnCalendar=2024-12-25 00:00:00
# λ²μ
OnCalendar=*-*-* 08..18:00:00 # λ§€μκ° (8μ-18μ)
# νμ΄λ¨Έ ν
μ€νΈ
systemd-analyze calendar "Mon *-*-* 09:00:00"
systemd-analyze calendar --iterations=5 "daily"
3.3 νμ΄λ¨Έ κ΄λ¦¬¶
# νμ΄λ¨Έ μμ/νμ±ν
systemctl start backup.timer
systemctl enable backup.timer
# νμ΄λ¨Έ λͺ©λ‘
systemctl list-timers
systemctl list-timers --all
# νμ΄λ¨Έ μν
systemctl status backup.timer
# μ¦μ μ€ν (νμ΄λ¨Έ 무μ)
systemctl start backup.service
# cronμμ λ§μ΄κ·Έλ μ΄μ
# crontab: 0 2 * * * /usr/local/bin/backup.sh
# β systemd timer: OnCalendar=*-*-* 02:00:00
3.4 μ¬λ¬ μ€μΌμ€¶
# /etc/systemd/system/multi-schedule.timer
[Unit]
Description=Multiple Schedule Timer
[Timer]
# μ¬λ¬ μκ° μ§μ κ°λ₯
OnCalendar=Mon *-*-* 06:00:00
OnCalendar=Wed *-*-* 06:00:00
OnCalendar=Fri *-*-* 06:00:00
# λλ
OnCalendar=Mon,Wed,Fri *-*-* 06:00:00
[Install]
WantedBy=timers.target
4. μμΌ νμ±ν¶
4.1 μμΌ νμ±ν κ°λ ¶
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β μμΌ νμ±ν νλ¦ β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β 1. λΆν
μ β
β βββββββββββ β
β β systemd ββββΆ μμΌ μ΄κΈ° (μλΉμ€ μμ μ ν¨) β
β βββββββββββ β
β β β
β βΌ β
β βββββββββββ β
β β socket β (λκΈ° μ€) β
β βββββββββββ β
β β
β 2. μ°κ²° μμ² μ β
β βββββββββββ βββββββββββ βββββββββββ β
β β Client βββββββΆβ socket βββββββΆβ systemd β β
β βββββββββββ βββββββββββ βββββββββββ β
β β β
β βΌ β
β μλΉμ€ μμ β
β β β
β βΌ β
β βββββββββββ β
β β service β β
β βββββββββββ β
β β
β μ₯μ : β
β β’ λΆν
μκ° λ¨μΆ β
β β’ μμ² μμλ§ μλΉμ€ μμ β
β β’ μλΉμ€ μ¬μμ μ€μλ μ°κ²° μ μ§ β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
4.2 μμΌ μ λ¶
# /etc/systemd/system/myapp.socket
[Unit]
Description=My App Socket
[Socket]
# TCP μμΌ
ListenStream=8080
# λλ IP μ§μ
# ListenStream=127.0.0.1:8080
# λλ IPv6
# ListenStream=[::1]:8080
# Unix μμΌ
# ListenStream=/run/myapp/myapp.sock
# SocketUser=myapp
# SocketGroup=myapp
# SocketMode=0660
# UDP μμΌ
# ListenDatagram=8081
# μ°κ²° λκΈ°μ΄
Backlog=128
# μ°κ²°λΉ νλμ μλΉμ€ μΈμ€ν΄μ€
Accept=no # κΈ°λ³Έκ°, νλμ μλΉμ€κ° λͺ¨λ μ°κ²° μ²λ¦¬
# Accept=yes # μ°κ²°λ§λ€ μ μΈμ€ν΄μ€ (inetd μ€νμΌ)
# μλΉμ€μ μ°κ²° (κΈ°λ³Έ: κ°μ μ΄λ¦.service)
# Service=myapp.service
[Install]
WantedBy=sockets.target
---
# /etc/systemd/system/myapp.service
[Unit]
Description=My App Service
Requires=myapp.socket
[Service]
Type=simple
ExecStart=/opt/myapp/bin/myapp
# μμΌμ fd 3μΌλ‘ μ λ¬λ¨ (λλ $LISTEN_FDS)
[Install]
WantedBy=multi-user.target
4.3 μμΌ νμ±ν μλΉμ€ μμ ¶
#!/usr/bin/env python3
# /opt/myapp/bin/myapp.py
# μμΌ νμ±νλ₯Ό μ§μνλ Python μλ²
import socket
import os
import sys
def get_systemd_socket():
"""systemdμμ μ λ¬λ μμΌ κ°μ Έμ€κΈ°"""
# LISTEN_FDS: μ λ¬λ fd κ°μ
# LISTEN_PID: λμ νλ‘μΈμ€ PID
listen_fds = int(os.environ.get('LISTEN_FDS', 0))
listen_pid = int(os.environ.get('LISTEN_PID', 0))
if listen_pid != os.getpid():
return None
if listen_fds >= 1:
# fd 3λΆν° μμ (0=stdin, 1=stdout, 2=stderr)
return socket.fromfd(3, socket.AF_INET, socket.SOCK_STREAM)
return None
def main():
# systemd μμΌ λλ μ μμΌ μμ±
sock = get_systemd_socket()
if sock is None:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind(('0.0.0.0', 8080))
sock.listen(128)
print("Listening on port 8080")
else:
print("Using systemd socket")
while True:
conn, addr = sock.accept()
with conn:
print(f"Connection from {addr}")
conn.sendall(b"Hello from socket-activated service!\n")
if __name__ == '__main__':
main()
5. μμ‘΄μ±κ³Ό μμ¶
5.1 μμ‘΄μ± μ§μμ¶
[Unit]
# Requires: νμ μμ‘΄μ± (μμ‘΄ μ λ μ€ν¨ μ μ΄ μ λλ μ€ν¨)
Requires=postgresql.service
# Wants: μ νμ μμ‘΄μ± (μμ‘΄ μ λ μ€ν¨ν΄λ κ³μ)
Wants=redis.service
# Requisite: μ΄λ―Έ νμ±νλ μ λμλ§ μμ‘΄
Requisite=network.target
# BindsTo: κ°ν μμ‘΄μ± (μμ‘΄ μ λ μ’
λ£ μ μ΄ μ λλ μ’
λ£)
BindsTo=libvirtd.service
# PartOf: μμ‘΄ μ λ μ¬μμ/μ’
λ£ μ κ°μ΄ μ¬μμ/μ’
λ£
PartOf=docker.service
# Conflicts: λμ μ€ν λΆκ°
Conflicts=shutdown.target
5.2 μμ μ§μμ¶
[Unit]
# After: μ§μ μ λ μμ νμ μμ
After=network.target postgresql.service
# Before: μ§μ μ λ μμ μ μ μμ
Before=httpd.service
# μμ‘΄μ±κ³Ό μμλ λ³κ°!
# Wants=postgresql.service β postgresqlκ³Ό ν¨κ» μμ μλ
# After=postgresql.service β postgresql μμ μλ£ ν μμ
# μ¬λ°λ₯Έ μ‘°ν©
Wants=postgresql.service
After=postgresql.service
5.3 Target μ λ¶
# /etc/systemd/system/myapp.target
[Unit]
Description=My Application Stack
Requires=myapp-web.service myapp-worker.service
After=myapp-web.service myapp-worker.service
[Install]
WantedBy=multi-user.target
# μ¬μ©
systemctl start myapp.target # λͺ¨λ κ΄λ ¨ μλΉμ€ μμ
systemctl stop myapp.target # λͺ¨λ κ΄λ ¨ μλΉμ€ μ’
λ£
systemctl restart myapp.target
5.4 μμ‘΄μ± μκ°ν¶
# μμ‘΄μ± νΈλ¦¬
systemctl list-dependencies nginx.service
systemctl list-dependencies --reverse nginx.service
# λΆν
μμ λΆμ
systemd-analyze
systemd-analyze blame
systemd-analyze critical-chain
systemd-analyze critical-chain nginx.service
# κ·Έλν μμ± (SVG)
systemd-analyze dot | dot -Tsvg > systemd.svg
systemd-analyze dot "nginx.service" | dot -Tsvg > nginx-deps.svg
6. journald λ‘κΉ ¶
6.1 journalctl κΈ°λ³Έ¶
# μ 체 λ‘κ·Έ
journalctl
# νΉμ μ λ λ‘κ·Έ
journalctl -u nginx.service
# μ€μκ° λ‘κ·Έ (tail -f)
journalctl -f
journalctl -fu nginx.service
# λΆν
λ‘κ·Έ
journalctl -b # νμ¬ λΆν
journalctl -b -1 # μ΄μ λΆν
journalctl --list-boots
# μκ° λ²μ
journalctl --since "2024-01-01"
journalctl --since "1 hour ago"
journalctl --since "2024-01-01" --until "2024-01-02"
journalctl --since yesterday
# μ°μ μμ νν°
journalctl -p err # error μ΄μ
journalctl -p warning # warning μ΄μ
# 0=emerg, 1=alert, 2=crit, 3=err, 4=warning, 5=notice, 6=info, 7=debug
# 컀λ λ©μμ§
journalctl -k
journalctl --dmesg
# JSON μΆλ ₯
journalctl -o json
journalctl -o json-pretty
# λμ€ν¬ μ¬μ©λ
journalctl --disk-usage
# λ‘κ·Έ μ 리
journalctl --vacuum-size=500M
journalctl --vacuum-time=7d
6.2 journald μ€μ ¶
# /etc/systemd/journald.conf
[Journal]
# μ μ₯ λ°©μ
Storage=persistent # μꡬ μ μ₯ (/var/log/journal)
# Storage=volatile # λ©λͺ¨λ¦¬λ§ (/run/log/journal)
# Storage=auto # /var/log/journal μμΌλ©΄ persistent
# ν¬κΈ° μ ν
SystemMaxUse=500M # μ΅λ λμ€ν¬ μ¬μ©λ
SystemMaxFileSize=50M # κ°λ³ νμΌ μ΅λ ν¬κΈ°
RuntimeMaxUse=100M # λ°νμ(λ©λͺ¨λ¦¬) μ΅λ
# 보쑴 κΈ°κ°
MaxRetentionSec=1month
# μμΆ
Compress=yes
# syslog μ λ¬
ForwardToSyslog=no
# μ½μ μΆλ ₯
ForwardToConsole=no
# μλ μ ν
RateLimitIntervalSec=30s
RateLimitBurst=10000
# μ€μ μ μ©
systemctl restart systemd-journald
# μꡬ μ μ₯ λλ ν 리 μμ±
mkdir -p /var/log/journal
systemd-tmpfiles --create --prefix /var/log/journal
6.3 ꡬ쑰νλ λ‘κΉ ¶
# systemd-catμΌλ‘ λ‘κ·Έ μ μ‘
echo "Hello" | systemd-cat -t myapp -p info
# μ€ν¬λ¦½νΈμμ
#!/bin/bash
exec 1> >(systemd-cat -t myscript -p info)
exec 2> >(systemd-cat -t myscript -p err)
echo "This goes to journal"
# Pythonμμ (systemd.journal)
from systemd import journal
journal.send('Hello from Python',
PRIORITY=journal.LOG_INFO,
SYSLOG_IDENTIFIER='myapp',
MYFIELD='custom_value')
6.4 λ‘κ·Έ νν°λ§ κ³ κΈ¶
# νλ κΈ°λ° νν°λ§
journalctl _SYSTEMD_UNIT=nginx.service
journalctl _UID=1000
journalctl _PID=1234
journalctl _COMM=nginx
# μ¬λ¬ 쑰건 (AND)
journalctl _SYSTEMD_UNIT=nginx.service _PID=1234
# OR 쑰건
journalctl _SYSTEMD_UNIT=nginx.service + _SYSTEMD_UNIT=php-fpm.service
# νΉμ νλ μΆλ ₯
journalctl -o verbose
journalctl -u nginx --output-fields=MESSAGE,_PID
# grepκ³Ό ν¨κ»
journalctl -u nginx | grep -i error
journalctl -u nginx -g "error|warning" # -gλ grep ν¨ν΄
7. μ°μ΅ λ¬Έμ ¶
μ°μ΅ 1: μΉ μ ν리μΌμ΄μ μλΉμ€¶
# μꡬμ¬ν:
# 1. Python/Node.js μΉ μ±μ μλΉμ€λ‘ λ±λ‘
# 2. μ¬μμ μ μ±
μ€μ (on-failure)
# 3. νκ²½ λ³μ νμΌ μ¬μ©
# 4. 보μ μ΅μ
μ μ©
# μλΉμ€ μ λ μμ±:
μ°μ΅ 2: λ°±μ νμ΄λ¨Έ¶
# μꡬμ¬ν:
# 1. λ§€μΌ μλ²½ 3μ λ°±μ
μ€ν
# 2. λ§€μ£Ό μΌμμΌ μ 체 λ°±μ
# 3. λμΉ μ€ν 보μ
# 4. λ‘κ·Έλ₯Ό journalμ κΈ°λ‘
# νμ΄λ¨Έ λ° μλΉμ€ μ λ μμ±:
μ°μ΅ 3: μμΌ νμ±ν μλΉμ€¶
# μꡬμ¬ν:
# 1. ν¬νΈ 9000μμ λκΈ°
# 2. μ°κ²° μμλ§ μλΉμ€ μμ
# 3. μ ν΄ μ μλ μ’
λ£ (IdleTimeout)
# μμΌ λ° μλΉμ€ μ λ μμ±:
μ°μ΅ 4: λ§μ΄ν¬λ‘μλΉμ€ μ€ν¶
# μꡬμ¬ν:
# 1. API μλΉμ€ (api.service)
# 2. μ컀 μλΉμ€ (worker.service)
# 3. λ°μ΄ν°λ² μ΄μ€ μμ‘΄μ±
# 4. μ 체 μ€ν target
# λͺ¨λ μ λ νμΌ μμ±:
λ€μ λ¨κ³¶
- 14_μ±λ₯_νλ - μμ€ν μ±λ₯ μ΅μ ν
- 15_컨ν μ΄λ_λ΄λΆ_ꡬ쑰 - cgroups, namespaces
- systemd 곡μ λ¬Έμ
μ°Έκ³ μλ£¶
β μ΄μ : 보μκ³Ό λ°©νλ²½ | λ€μ: μ±λ₯ νλ β | λͺ©μ°¨