๐งฑ Linux systemctl ่ๆๅ็ฎก็ๅ จๆป็ฅ(ๅซๅธธ่ฆ้ฏ่ชค่่ชๅ้ๅ่จญๅฎ)
้็ฏๆด็ systemctl ็ๅธธ็จ่้ฒ้ๆไฝ:ๅพ ๆฅ่ฉข่ๆงๅถๆๅ、้ๆฉ่ชๅ、่ชๅ้ๅ็ญ็ฅ、่ฆๅฏซ drop-in ๅฐ journalctl ๆ้ฏ、Timer ๆ็จ、ๅฎๅ จๅผทๅ,ๆไพๅฏ็ดๆฅ่ค่ฃฝ็ๆไปค่็ฏไพๅฎๅ ๆช。
๐ ็ฎ้
- ไธ、ๅธธ็จ systemctl ๆไปค้ๆฅ
- ไบ、้ๆฉ่ชๅๅๅ่็ฎๆจ(target)
- ไธ、่ชๅ้ๅ็ญ็ฅ(Restart=)ๆไฝณๅฏฆๅ
- ๅ、Service Unit ๆจฃๆฟ:็ฉฉๅฎ、ๅฏๅๅพฉ、ๅฏ่งๆธฌ
- ไบ、ไธๆนๅๆช็่ฆๅฏซ:drop-in(systemctl edit)
- ๅ ญ、ๅธธ่ฆ้ฏ่ชค่ๆๆฅๆธ ๅฎ
- ไธ、journalctl ่ๅๅ่ๆๅๆ
- ๅ ซ、Timer vs cron:ไบไปถๅผๆ็จ่่ฃ่ท
- ไน、ๆๅๆฒ็ฎฑ่่ณๆบ้ๅถ
- ๐ ๅธธ่ฆๅ็ญ(FAQ)
- ๐งญ ่กๅๆธ ๅฎ
- ๐ ๅปถไผธ้ฑ่ฎ
ไธ、ๅธธ็จ systemctl ๆไปค้ๆฅ
# ๅๅ / ๅๆญข / ้ๆฐๅๅ / ้ๆฐ่ผๅ
ฅ่จญๅฎ
sudo systemctl start nginx
sudo systemctl stop nginx
sudo systemctl restart nginx
sudo systemctl reload nginx
# ๆฅ็็ๆ
่ๅณๆๆฅ่ช
systemctl status nginx
journalctl -u nginx -f
# ๆฅ็ๆฏๅฆ้ๆฉ่ชๅ;่จญๅฎ้ๆฉ่ชๅ / ๅๆถ
systemctl is-enabled nginx
sudo systemctl enable nginx
sudo systemctl disable nginx
# ๅๅบๆๅ、ๅฅ็จ่ฎๆด
systemctl list-units --type=service --state=running
sudo systemctl daemon-reload
# ๆฅ็ๅฎๅ
ๆช่ไพ่ณด
systemctl cat nginx.service
systemctl list-dependencies multi-user.target
ไบ、้ๆฉ่ชๅๅๅ่็ฎๆจ(target)
enable ๆๅปบ็ซ WantedBy ็ฎๆจ(้ๅธธ multi-user.target),่ฎๆๅๆผ้ๆฉๆ่ผๅ
ฅ。
# ็ฎๅ้ ่จญ target ่ๅๆ
systemctl get-default
sudo systemctl set-default multi-user.target
sudo systemctl isolate rescue.target # ็ซๅณๅๆๅฐ็ถญ่ญทๆจกๅผ
ไธ、่ชๅ้ๅ็ญ็ฅ(Restart=)ๆไฝณๅฏฆๅ
Restart=on-failure:้ 0 ็ตๆ็ขผๆ้ๅ,ๆๅธธ็จ。Restart=always:ไปปไฝ็ตๆ้ฝ้ๅ,็จๆผ้ท้ง、้ ้ซๅฏ็จ็ๆๅ。RestartSec=:้ๅ้้;StartLimitIntervalSec=+StartLimitBurst=้ฒๆญข็็้ๅ。- ๅ ไธ
RuntimeMaxSec=ๆๅฅๅบทๆชขๆฅ่ ณๆฌ,้ฟๅ ๆๅๅกๆญป็กๆ。
ๅ、Service Unit ๆจฃๆฟ:็ฉฉๅฎ、ๅฏๅๅพฉ、ๅฏ่งๆธฌ
๐ ้ปๆๅฑ้็ฏไพ(ๅปบ่ญฐ่ค่ฃฝๅพไพๅฏฆ้่ทฏๅพ่ไฝฟ็จ่ ่ชฟๆด)
[Unit]
Description=My Web App
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=www-data
WorkingDirectory=/opt/myapp
ExecStart=/usr/bin/python3 /opt/myapp/app.py
# --- ้ๅ็ญ็ฅ ---
Restart=on-failure
RestartSec=3
StartLimitIntervalSec=60
StartLimitBurst=5
# --- ็ฐๅข่ๆฅ่ช ---
Environment="ENV=prod" "PORT=8080"
StandardOutput=journal
StandardError=journal
# --- ๆฒ็ฎฑๅ(่ฆไธ็ฏ Hardening)---
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=full
ProtectHome=true
[Install]
WantedBy=multi-user.target
ไบ、ไธๆนๅๆช็่ฆๅฏซ:drop-in(systemctl edit)
ไธ่ฆๆนๅฅไปถๆไพ็ /usr/lib/systemd/system/*.service;็จ drop-in ๆดๅฎๅ
จ。
sudo systemctl edit myapp.service
# ๆ้ๅ /etc/systemd/system/myapp.service.d/override.conf
# ๅชๆพๅทฎ็ฐ:
[Service]
Restart=always
Environment="DEBUG=false"
# ๅฅ็จ
sudo systemctl daemon-reload
sudo systemctl restart myapp.service
systemctl cat myapp.service
ๅ ญ、ๅธธ่ฆ้ฏ่ชค่ๆๆฅๆธ ๅฎ
- ๐ ๅๅๅกไฝ:็ผบ
Wants=network-online.targetๆๆชๆญฃ็ขบ็ญๅพ ็ถฒ่ทฏ;ๆชขๆฅNetworkManager-wait-onlineๆsystemd-networkd-wait-online。 - ๐ ๆฌ้้ฏ่ชค:ๆๅ
User=ๆๅฎๅธณ่ๆฏๅฆๆๆ็ฎ้่ๆชๆกๆฌ้;็จchown/chmodไฟฎๆญฃ。 - ๐ ่ทฏๅพไธๅญๅจ:ๅจ
ExecStartPre=/usr/bin/mkdir -p /var/lib/myappๅ ๅปบ็ซ。 - ๐ป Type ่จญ้ฏ:ๅณ็ตฑ daemon ๆ
Type=forking;ๆ้็ฅๆฉๅถๆ็จnotify。 - ๐ ็ก้้ๅ:่ชฟๆด
RestartSec、StartLimit*,ไธฆ็จjournalctl -xeuๆพๆ นๅ 。
ไธ、journalctl ่ๅๅ่ๆๅๆ
# ็ถๆฌก้ๆฉ็้่ฆ่จๆฏ
journalctl -b -p warning
# ่ฟฝๆๅๆฅ่ช(ๅณๆ)
journalctl -u myapp.service -f
# ๅๅ่ๆ็ธฝ่ฆฝ่้้ต้
systemd-analyze
systemd-analyze blame
systemd-analyze critical-chain
# ่ผธๅบๅๅๆต็จๅ(SVG)
systemd-analyze plot > /tmp/boot.svg
ๅ ซ、Timer vs cron:ไบไปถๅผๆ็จ่่ฃ่ท
๐ ็ฏไพ:ๆฏๅคฉ 02:15 ๅท่กๅไปฝ、้ๆฉๆ้่ฃ่ท
# /etc/systemd/system/backup.service
[Unit]
Description=Nightly Backup
[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup.sh
# /etc/systemd/system/backup.timer
[Unit]
Description=Run backup daily
[Timer]
OnCalendar=*-*-* 02:15:00
Persistent=true
RandomizedDelaySec=120
[Install]
WantedBy=timers.target
# ๅ็จ
sudo systemctl enable --now backup.timer
systemctl list-timers --all
ไน、ๆๅๆฒ็ฎฑ่่ณๆบ้ๅถ
- ่ณๆบ้ๅถ:
CPUQuota=50%、MemoryMax=1G。 - ๆฒ็ฎฑๅ้ธ้
:
NoNewPrivileges=true、PrivateTmp=true、ProtectSystem=full、ProtectHome=true、CapabilityBoundingSet=(ๆๅฐๆฌ้)。 - ่จๆ้ๅถๅท่ก:
systemd-run --scope -p CPUQuota=50% -p MemoryMax=1G <cmd>
# ไปฅ 50% CPU、1G ่จๆถ้ซ้ๅถๅท่ก
sudo systemd-run --unit=limit-job --scope -p CPUQuota=50% -p MemoryMax=1G /usr/bin/some-task
๐ ๅธธ่ฆๅ็ญ(FAQ)
Q1:ๆๆนไบ unit ๆช,ไฝๆๅๆฒๆๅฅ็จ?
่ซๅ
sudo systemctl daemon-reload ๅ restart。่ฎๆดๆๆ่ขซ่ผๅ
ฅ。
Q2:ๆๅๅทฒ enable,็บไฝ้ๆฉๆฒๆ่ท?
ๆชขๆฅ WantedBy ๆๅฑฌ target ๆฏๅฆ็บ็ณป็ตฑ get-default ็ไพ้้;ๅฆๆฅ journalctl -b。
Q3:ๅฆไฝ่ฎ oneshot ไปปๅๅคฑๆไน่ฝ้่ฉฆ?
ๅจ [Service] ไฝฟ็จ Restart=on-failure ่ RestartSec=,ไธฆๅฐ้่ผฏๆ็บๅฏ้ๅ
ฅ。
๐งญ ่กๅๆธ ๅฎ
✅ ๅฐๆขๆๆๅๅ ๅ ฅ Restart ็ญ็ฅ่ StartLimit* ไฟ่ญท ✅ ไปฅ systemctl edit ๅปบ็ซ drop-in ่ฆๅฏซ(ไธๅๅๆช) ✅ ็จ journalctl ่ systemd-analyze ๆชขๆฅ้ๆฉ็ถ้ ธ ✅ ้้ตไปปๅๆน็จ Timer,ๅ็จ Persistent ่ RandomizedDelaySec ✅ ๅฅ็จๆฒ็ฎฑๅ้ธ้ ่่ณๆบไธ้(CPUQuota / MemoryMax)
๐ ๅปถไผธ้ฑ่ฎ
- ๐ง Linux systemd ๆทฑๅ ฅ่งฃๆ่ๅๅๆต็จ็ฎก็
- Linux sed ไฝฟ็จๅบ็ค่ชชๆ:ๆๅญๅไปฃ、ๅช้ค่ๅธธ็จ็ฏไพ
- Linux Log ๅๆ่ GoAccess ็ถฒ้ ๅ ฑ่กจ
- Linux Proxy Server ๅปบ็ฝฎๆๅญธ(Squid ๅฎ่ฃ่่จญๅฎๆๅ)
— WWFandy・็ณป็ตฑ็ฎก็็ญ่จ
ๆฒๆ็่จ:
ๅผต่ฒผ็่จ