็†ฑ้–€ๅˆ†้กž
 ่ผ‰ๅ…ฅไธญ…
็›ฎ้Œ„

๐Ÿง Linux systemd ๆทฑๅ…ฅ่งฃๆž่ˆ‡ๅ•Ÿๅ‹•ๆต็จ‹็ฎก็†

    ๐Ÿง Linux systemd ๆทฑๅ…ฅ่งฃๆž่ˆ‡ๅ•Ÿๅ‹•ๆต็จ‹็ฎก็†

    ๅœจ็พไปฃ Linux ็™ผ่กŒ็‰ˆไธญ,systemd ๅนพไนŽๆ˜ฏ้ ่จญ็š„ๅˆๅง‹ๅŒ–็ณป็ตฑ(init),่ฒ ่ฒฌ ้–‹ๆฉŸๆต็จ‹ๆœๅ‹™็ฎก็†ๆ—ฅ่ชŒๅฎšๆ™‚ไปปๅ‹™ ่ˆ‡ ่ณ‡ๆบๆŽงๅˆถ ็ญ‰ๅทฅไฝœ。ๆœฌๆ–‡ๅพž ๅ•Ÿๅ‹•้ˆ ๅˆฐ ๅ–ฎๅ…ƒ(unit)่จญ่จˆๆŽ’้Œฏๅฎ‰ๅ…จๅผทๅŒ– ่ˆ‡ ๆœ€ไฝณๅฏฆๅ‹™,ๅธถไฝ ๅฎŒๆ•ดๆŽŒๆก。

    ๐Ÿ“‘ ็›ฎ้Œ„

    ไธ€、้–‹ๆฉŸๅ•Ÿๅ‹•้ˆ(Boot Chain)

    1. Firmware/UEFI → Bootloader(GRUB):่ผ‰ๅ…ฅๆ ธๅฟƒ่ˆ‡ initramfs。
    2. kernel:ๆŽ›่ผ‰ root、ๅ•Ÿๅ‹• PID 1(systemd)。
    3. systemd:่งฃๆž้ ่จญ target(ๅคšไฝฟ็”จ default.target ๆŒ‡ๅ‘ graphical.target ๆˆ– multi-user.target)。
    4. ไพ่ณด่งฃๆž:ไพๅ–ฎๅ…ƒ(unit)้–“็š„ Requires/WantsBefore/AfterConflicts ๅŸท่กŒ。
    # ๆŸฅ็œ‹็›ฎๅ‰้ ่จญ target ่ˆ‡ๅˆ‡ๆ›
    systemctl get-default
    sudo systemctl set-default multi-user.target
    sudo systemctl isolate rescue.target    # ็ซ‹ๅณๅˆ‡ๅˆฐ็ถญ่ญทๆจกๅผ

    ไบŒ、Unit ๅŸบ็คŽ:้กžๅž‹、็›ฎๆจ™่ˆ‡ไพ่ณด

    ๅธธ่ฆ‹ๅ–ฎๅ…ƒ้กžๅž‹:

    • service:ๅธธ้งๆˆ–ไธ€ๆฌกๆ€งๆœๅ‹™。
    • socket:socket-activated ๆœๅ‹™(ๆŒ‰้œ€ๅ•Ÿๅ‹•)。
    • timer:ๅ–ไปฃๆˆ–่ฃœๅผท cron ็š„ๆŽ’็จ‹。
    • target:ไธ€็ต„ๅ–ฎๅ…ƒ็š„้›†ๅˆ(้šŽๆฎตๆˆ–็‹€ๆ…‹)。
    • path:ๆช”ๆกˆ/็›ฎ้Œ„่ฎŠๅ‹•่งธ็™ผ。
    • mount/automountdevice:ๆŽ›่ผ‰ๆˆ–่ฃ็ฝฎไบ‹ไปถ。
    # ๆŸฅไพ่ณด่ˆ‡ๅŸท่กŒ้—œไฟ‚
    systemctl list-dependencies multi-user.target
    systemctl cat sshd.service
    systemctl status NetworkManager.service

    ไธ‰、Service ่จญ่จˆ:Type、Restart、Environment

    Type ๅฝฑ้Ÿฟ systemd ๅˆคๅฎš「ๆœๅ‹™ๅทฒๅฐฑ็ท’」็š„ๆ–นๅผ:

    • simple(้ ่จญ):ไธป่กŒ็จ‹ไธ daemonize。
    • forking:่กŒ็จ‹ fork() ๅพŒๅœจ่ƒŒๆ™ฏๅธธ้ง(ๅ‚ณ็ตฑ daemon)。
    • notify:็จ‹ๅผ้€้Ž sd_notify ๅ‘Š็Ÿฅ「ๅฐฑ็ท’」。
    • oneshot:ไธ€ๆฌกๆ€งไปปๅ‹™,ๅธธๆญ้… RemainAfterExit=yes
    ็ฏ„ไพ‹:็ฉฉๅฎš่‡ชๅ‹•้‡ๅ•Ÿ็š„ๅธธ้งๆœๅ‹™
    [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
    Environment="ENV=prod" "PORT=8080"
    # ๅฎ‰ๅ…จๅปบ่ญฐ(่ฆ‹ไธ‹็ฏ€ Hardening)
    NoNewPrivileges=true
    PrivateTmp=true
    ProtectSystem=full
    ProtectHome=true
    
    [Install]
    WantedBy=multi-user.target

    ๅ››、่ฆ†ๅฏซ่ˆ‡ Drop-in:ไธๅ‹•ๅŽŸๆช”ไนŸ่ƒฝๅฎข่ฃฝ

    ไธ่ฆ็›ดๆŽฅๆ”นๅฅ—ไปถๆไพ›็š„ /usr/lib/systemd/system/*.service。ๆ”น็”จ่ฆ†ๅฏซ:

    sudo systemctl edit myapp.service   # ๆœƒๅœจ /etc/systemd/system/myapp.service.d/ ๅปบ็ฝฎ drop-in
    # ็ทจๅฏซๅ…งๅฎน(ๅชๆ”พๅทฎ็•ฐ):
    [Service]
    Environment="DEBUG=false"
    Restart=always

    ๅฅ—็”จไธฆๆŸฅ็œ‹:

    sudo systemctl daemon-reload
    sudo systemctl restart myapp.service
    systemctl cat myapp.service

    ไบ”、Timer vs cron:ไบ‹ไปถๅผๆŽ’็จ‹็š„ๅ„ชๅ‹ข

    • ่ˆ‡ service ็ถๅฎš:ๆŽ’็จ‹่งธ็™ผๅฐๆ‡‰ service,็ฎก็†ไธ€่‡ด。
    • ๆ”ฏๆดๆ–ๆ™ƒๆ™‚้–“(RandomizedDelay):้ฟๅ…ๅฐ–ๅณฐ。
    • ็ผบๆผ่ฃœ่ท‘(Persistent):ๆฉŸๅ™จ้—œๆฉŸๆœŸ้–“็š„ไปปๅ‹™ๆœƒ่ฃœๅŸท่กŒ。
    ็ฏ„ไพ‹:ๆฏๅคฉ 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

    ๅ…ญ、Socket/Path/Device ๅ•Ÿๅ‹•:ๆŒ‰้œ€่ผ‰ๅ…ฅ

    socket ๅ•Ÿๅ‹•่ฎ“ๆœๅ‹™ๅœจ้€ฃ็ทš็™ผ็”Ÿๆ™‚ๅ†ๅ•Ÿ็”จ,้™ไฝŽๅธธ้ง่ณ‡ๆบ。

    # ่ง€ๅฏŸ socket ่ˆ‡ๅฐๆ‡‰ service
    systemctl list-sockets
    systemctl status ssh.socket

    ไธƒ、ๆ—ฅ่ชŒ่ˆ‡้–‹ๆฉŸๅˆ†ๆž:journalctl ่ˆ‡ systemd-analyze

    # ๅช็œ‹ๆœฌๆฌก้–‹ๆฉŸ、้‡่ฆ็ญ‰็ดšไปฅไธŠ
    journalctl -b -p warning
    
    # ่ฟฝๆœๅ‹™ๆ—ฅ่ชŒ(ๅณๆ™‚)
    journalctl -u myapp.service -f
    
    # ๅ•Ÿๅ‹•่€—ๆ™‚็ธฝ่ฆฝ่ˆ‡้—œ้ต้ˆ
    systemd-analyze
    systemd-analyze blame
    systemd-analyze critical-chain
    
    # ็”ข็”Ÿ SVG(ๆ–ผๆกŒ้ข้–‹ๅ•Ÿๆชข่ฆ–)
    systemd-analyze plot > boot.svg

    ๅ…ซ、่ณ‡ๆบๆŽงๅˆถ่ˆ‡ๆฒ™็ฎฑ:cgroups ่ˆ‡ Hardening

    • CPU/่จ˜ๆ†ถ้ซ”้™ๅˆถCPUQuota=50%MemoryMax=1G
    • ๆฒ™็ฎฑๅŒ–้ธ้ …NoNewPrivileges=truePrivateTmp=trueProtectSystem=fullProtectHome=trueCapabilityBoundingSet=
    • ่‡จๆ™‚ๆœๅ‹™systemd-run --scope / --unit ๅฟซ้€ŸๆŽ›้™ๅˆถ่ท‘ไปปๅ‹™。
    # ไปฅ 50% CPU、1G ่จ˜ๆ†ถ้ซ”้™ๅˆถๅŸท่กŒไปปๅ‹™
    sudo systemd-run --unit=limit-job --scope -p CPUQuota=50% -p MemoryMax=1G /usr/bin/some-task

    ไน、ๅธธ่ฆ‹้Œฏ่ชค่ˆ‡ๆŽ’ๆŸฅๆธ…ๅ–ฎ

    • ๆœๅ‹™ๅ•Ÿๅ‹•ๅกไฝ:ๆชขๆŸฅ After=network-online.target ๆ˜ฏๅฆ็ผบ Wants=network-online.target;็ขบ่ช systemd-networkd-wait-online ๆˆ– NetworkManager ้€ฃ็ทš็ญ‰ๅพ…่จญๅฎš。
    • ๆฌŠ้™ๅ•้กŒ:ๆœๅ‹™ User= ๆŒ‡ๅฎš็”จๆˆถไน‹ๆช”ๆกˆ/็›ฎ้Œ„ๆฌŠ้™(ๅƒ่€ƒ chmod/chown ๅŸบ็คŽ)。
    • ่ทฏๅพ‘ๆœชๅฐฑ็ท’:ไฝฟ็”จ path unit ๆˆ–ๅœจ ExecStartPre ๅŠ ๅ…ฅๆชขๆŸฅ/ๅปบ็ซ‹。
    • Daemonize ่ˆ‡ Type ไธ็ฌฆ:ๅ‚ณ็ตฑ daemon ่จญ Type=forking,ๅฆๅ‰‡ systemd ่ชคๅˆค็‹€ๆ…‹。
    • ้Œฏ่ชคๅพฉ็™ผ:่จญๅฎš Restart=on-failure ่ˆ‡ RestartSec=,ไธฆๅŠ ๅผทๆ—ฅ่ชŒๅˆ†ๆž(journalctl -xeu)。

    ๅ、ๅฏฆ็”จ Recipes(ๅฏ็›ดๆŽฅๅฅ—็”จ)

    ๐Ÿงฉ 1) ๆœๅ‹™้œ€็ญ‰「็ถฒ่ทฏๅฏ็”จ」ๅ†ๅ•Ÿๅ‹•
    [Unit]
    After=network-online.target
    Wants=network-online.target
    ๐Ÿงฉ 2) oneshot ๅˆๅง‹ๅŒ– + ๅธธ้งๆœๅ‹™ไธฒ่ฏ
    # init.service ๅšๆบ–ๅ‚™;myapp.service ็œŸๆญฃๅ•Ÿๅ‹•
    [Unit]
    Description=Initialize directories
    Before=myapp.service
    
    [Service]
    Type=oneshot
    ExecStart=/usr/local/bin/init_dirs.sh
    RemainAfterExit=yes
    
    [Install]
    WantedBy=multi-user.target
    ๐Ÿงฉ 3) ่‡ชๅ‹•้‡ๅ•Ÿไธฆ้™ๅˆถ้‡่ฉฆ้ ป็އ
    [Service]
    Restart=on-failure
    RestartSec=3
    StartLimitIntervalSec=60
    StartLimitBurst=5
    ๐Ÿงฉ 4) ็กฌๅŒ–ไธ€ๅ€‹็ถฒ้ ๆœๅ‹™(ๆœ€ๅฐ็‰นๆฌŠ)
    [Service]
    User=www-data
    NoNewPrivileges=true
    PrivateTmp=true
    ProtectSystem=full
    ProtectHome=true
    CapabilityBoundingSet=
    AmbientCapabilities=
    ReadWritePaths=/var/lib/myapp

    ๆœ€ๅพŒๆ›ดๆ–ฐ:2025-10-23 · ไฝœ่€…:WWFandy

    ๐Ÿ”— ๅˆ†ไบซ้€™็ฏ‡ LINE Facebook X

    ๆฒ’ๆœ‰็•™่จ€:

    ๅผต่ฒผ็•™่จ€

    ๅญ—็ดš