12-bo‘lim

systemd - ilovani xizmatga aylantirish

Unit fayl yozish, avtomatik qayta ishga tushirish, resurs cheklovlari va xizmatni izolyatsiyalash.

🕑 19 daqiqa o‘qish 📄 1 477 so‘z 👁 1 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. Unit fayl
  2. Sintaksisni tekshirish
  3. Ishga tushirish va holat
  4. Jurnal
  5. Avtomatik qayta ishga tushirish
  6. Resurs cheklovlari
  7. Xizmatni izolyatsiyalash
  8. Type= ni to'g'ri tanlash
  9. Xizmat yiqilganda
  10. Xulosa

Ilovani nohup ./ilova & bilan ishga tushirish - vaqtinchalik yechim. Server qayta yuklansa u ko'tarilmaydi, yiqilsa qayta turmaydi, jurnali qayerdaligi noma'lum va uni to'xtatganda bolalari qolib ketadi.

systemd bularning barchasini hal qiladi.

Unit fayl #

Terminal
systemctl stop sr-sinov 2>/dev/null
systemctl disable sr-sinov 2>/dev/null
systemctl reset-failed sr-sinov 2>/dev/null
rm -f /etc/systemd/system/sr-sinov.service

id sr-ilova >/dev/null 2>&1 || useradd --system --no-create-home \
    --shell /usr/sbin/nologin sr-ilova
mkdir -p /opt/sr-sinov
cat > /opt/sr-sinov/ilova.sh <<'EOF'
#!/bin/bash
echo "ilova ishga tushdi"
sleep 2
echo "ish tugadi"
EOF
chmod 755 /opt/sr-sinov/ilova.sh

cat > /etc/systemd/system/sr-sinov.service <<'EOF'
[Unit]
Description=Softromeda sinov xizmati
After=network.target

[Service]
Type=simple
ExecStart=/opt/sr-sinov/ilova.sh
Restart=no
User=sr-ilova
Group=sr-ilova
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=strict
MemoryMax=64M

[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload

Unit fayl uchta bo'limdan iborat:

Unit faylning uch bo'limi [Unit] Tavsif va boshqa unitlar bilan munosabat Description= systemctl status da ko'rinadi After= / Requires= tartib / majburiy bog'liqlik After - faqat TARTIB. Requires - agar u yiqilsa, bu ham to'xtaydi. [Service] Qanday ishga tushirish va nazorat qilish Type= simple / forking / oneshot / notify ExecStart= TO'LIQ yo'l - qobiq yo'q, PATH yo'q User= / Group= root bo'lmasin Restart= / RestartSec= yiqilsa nima qilinsin MemoryMax= / CPUQuota= resurs chegarasi (cgroup) ProtectSystem= / PrivateTmp= izolyatsiya [Install] enable qilinganda qayerga ulanadi WantedBy=multi-user.target yuklanishda avtomatik ishga tushsin [Install] bo'lmasa - systemctl enable ISHLAMAYDI.
Uch bo'lim: kim bilan, qanday, va qachon

Sintaksisni tekshirish #

Terminal
systemd-analyze verify /etc/systemd/system/sr-sinov.service && echo "unit fayl to'g'ri"
Natija
unit fayl to'g'ri
systemd-analyze verify - daemon-reload dan oldin

Bu buyruq unit faylni ishga tushirmasdan tekshiradi: xato kalit so'zlar, mavjud bo'lmagan ExecStart yo'li, noto'g'ri bog'liqliklar.

Jim chiqish - hammasi joyida degani.

Bu 7-bo'limdagi visudo -c va 8-bo'limdagi sshd -t bilan bir xil odat: sozlamani ishga tushirishdan oldin tekshirish.

Serverda bu uchta buyruqni yodda tuting:

NimaTekshiruv
sudoersvisudo -cf fayl
sshd_configsshd -t -f fayl
.servicesystemd-analyze verify fayl
nginx.confnginx -t

Ishga tushirish va holat #

Terminal
systemctl start sr-sinov
sleep 1
systemctl is-active sr-sinov
sleep 3
systemctl is-active sr-sinov
Natija
active
inactive

Xizmat ishga tushdi, ikki soniyadan keyin skript tugadi va Restart=no bo'lgani uchun qayta ko'tarilmadi.

BuyruqVazifa
systemctl startHozir ishga tushirish
systemctl stopTo'xtatish
systemctl restartTo'xtatib, qayta ishga tushirish
systemctl reloadUzmasdan sozlamani qayta o'qish
systemctl enableYuklanishda avtomatik ishga tushsin
systemctl disableAvtomatik ishga tushmasin
systemctl statusBatafsil holat va oxirgi jurnal
systemctl is-activeSkript uchun qisqa javob
start va enable - ikki xil ish

Bu xatoni deyarli har bir administrator bir marta qiladi.

BuyruqHozir ishlaydimiQayta yuklashdan keyin
startHaYo'q
enableYo'qHa
enable --nowHaHa

Klassik voqea: xizmat sozlandi, ishlayapti, hamma xursand. Uch oydan keyin server qayta yuklanadi - va xizmat ko'tarilmaydi.

Shuning uchun doim systemctl enable --now xizmat ishlating, va sozlagandan keyin systemctl is-enabled bilan tekshiring.

Terminal
systemctl enable sr-sinov > /dev/null 2>&1
systemctl is-enabled sr-sinov
systemctl disable sr-sinov > /dev/null 2>&1
systemctl is-enabled sr-sinov
Natija
enabled
disabled

Jurnal #

Xizmatning stdout va stderr chiqishi avtomatik jurnalga tushadi - hech qanday > log.txt kerak emas.

Terminal
systemctl start sr-sinov
sleep 3
journalctl -u sr-sinov -n 4 --no-pager -o cat
Natija
Started sr-sinov.service - Softromeda sinov xizmati.
ilova ishga tushdi
ish tugadi
sr-sinov.service: Deactivated successfully.

echo bilan chiqarilgan ikki satr o'rtada turibdi - systemd ularni o'zi yig'ib oldi.

Ilovada fayl jurnalini yozmang

Ko'p ilovalar o'z jurnal faylini yaratadi: /var/log/ilova.log. Serverda bu keraksiz murakkablik:

Fayl jurnalisystemd jurnali
Aylanishini o'zingiz sozlaysizAvtomatik
Diskni to'ldirishi mumkinChegarasi bor
Xizmat bilan bog'lanmagan-u xizmat bilan filtrlash
Har ilovada har xil formatYagona format va vaqt belgisi

To'g'ri yondashuv: ilova shunchaki stdout ga yozsin, qolganini systemd bajaradi. Bu konteynerlardagi yondashuv bilan ham bir xil.

13-bo'limda journalctl ni batafsil ko'ramiz.

Avtomatik qayta ishga tushirish #

Bu systemd ning eng qimmatli xususiyati.

Restart=Qachon qayta ishga tushadi
noHech qachon (standart)
on-failureFaqat xato bilan tugasa - odatda kerakli
alwaysHar doim, hatto toza chiqishda ham
on-abnormalSignal yoki taymaut bo'lsa
Terminal
mkdir -p /etc/systemd/system/sr-sinov.service.d
cat > /etc/systemd/system/sr-sinov.service.d/qayta.conf <<'EOF'
[Service]
Restart=on-failure
RestartSec=1
EOF
systemctl daemon-reload
systemctl show sr-sinov -p Restart -p RestartUSec
Natija
Restart=on-failure
RestartUSec=1s
.d/ katalogi - asl faylga tegmasdan o'zgartirish

Paket bilan kelgan unit faylni (/lib/systemd/system/nginx.service) tahrirlamang - keyingi yangilanishda o'zgarishingiz yo'qoladi.

To'g'ri yo'l - qo'shimcha fayl:

UsulNatija
systemctl edit nginx.d/override.conf yaratadi va ochadi
systemctl edit --full nginxTo'liq nusxani /etc ga ko'chiradi
systemctl cat nginxAsl fayl va barcha qo'shimchalarni ko'rsatadi
systemctl revert nginxBarcha o'zgarishlarni bekor qiladi

systemctl cat - eng foydalisi: u yakuniy sozlamani qaysi fayldan kelganini ko'rsatib beradi.

Faylni qo'lda yaratsangiz, systemctl daemon-reload ni unutmang - aks holda systemd eski nusxani ishlatadi.

Restart=always bilan cheksiz sikl

Xizmat ishga tushishi bilanoq yiqilsa (masalan sozlama xato), Restart=always uni cheksiz qayta ishga tushiradi - sekundiga o'nlab marta. Jurnal to'ladi, protsessor band bo'ladi.

systemd bunga qarshi himoyaga ega:

Natija
StartLimitIntervalSec=10
StartLimitBurst=5

Ya'ni 10 soniyada 5 martadan ko'p ishga tushsa, systemd to'xtaydi va xizmatni failed holatiga qo'yadi.

Shu sababli systemctl status da "start request repeated too quickly" xabarini ko'rsangiz - bu systemd sizni himoya qilgani, nosozlik emas. Haqiqiy sababni jurnaldan qidiring.

RestartSec= ni ham nolga qo'ymang - kamida 1-5 soniya bering.

Resurs cheklovlari #

Terminal
systemctl show sr-sinov -p MemoryMax -p User -p Group
Natija
MemoryMax=67108864
User=sr-ilova
Group=sr-ilova

64 MB bayt hisobida - systemd qiymatni cgroup uchun aylantirdi.

SozlamaVazifa
MemoryMax=512MQattiq chegara - oshsa o'ldiriladi
MemoryHigh=384MYumshoq chegara - sekinlashtiradi
CPUQuota=50%Yarim yadrodan ko'p emas
TasksMax=100Jarayonlar soni
LimitNOFILE=65535Ochiq fayllar (11-bo'lim)
OOMScoreAdjust=-500OOM Killer uchun himoya
MemoryMax - ma'lumotlar bazasini himoyalash usuli

11-bo'limda ko'rganimizdek, xotira tugaganda OOM Killer odatda MySQL ni tanlaydi - u eng ko'p xotira egallaydi.

Yechim - aybdorni cheklash, qurbonni emas:

Natija
[Service]
MemoryMax=512M

Endi xotira sizib ketayotgan ilova o'z chegarasida o'ldiriladi. Ma'lumotlar bazasi tegilmaydi, sayt ishlashda davom etadi, va jurnalda aniq sabab qoladi.

MySQL ni esa teskari tomondan himoyalang:

Natija
[Service]
OOMScoreAdjust=-500

Xizmatni izolyatsiyalash #

Bu sozlamalar buzilgan xizmatning zarar doirasini toraytiradi.

Terminal
systemctl show sr-sinov -p NoNewPrivileges -p PrivateTmp -p ProtectSystem
Natija
PrivateTmp=yes
ProtectSystem=strict
NoNewPrivileges=yes
SozlamaNima beradi
User=root emas - eng muhimi
NoNewPrivileges=truesetuid orqali huquq oshirib bo'lmaydi
PrivateTmp=trueO'z /tmp si - boshqalarnikini ko'rmaydi
ProtectSystem=strictButun fayl tizimi faqat o'qish
ProtectHome=true/home ko'rinmaydi
ReadWritePaths=/var/lib/ilovaFaqat shu katalogga yozadi
PrivateDevices=trueQurilma fayllari yo'q
CapabilityBoundingSet=Yadro imkoniyatlarini cheklash
ProtectSystem=strict bilan xizmat yoza olmay qoladi

strict butun fayl tizimini faqat o'qish rejimiga qo'yadi - /var va /etc ni ham.

Agar xizmatingiz fayl yozishi kerak bo'lsa, aniq ruxsat bering:

Natija
ProtectSystem=strict
ReadWritePaths=/var/lib/ilova /var/log/ilova

Bu "hammasi taqiq, keraklisi ruxsat" yondashuvi - sudo da ham, xavfsizlik devorida ham (16-bo'lim) bir xil g'oya.

Xizmatning izolyatsiya darajasini baholash:

Terminal
systemd-analyze security sr-sinov

U 0 dan 10 gacha ball beradi va qaysi sozlama yetishmayotganini ro'yxat qilib ko'rsatadi.

Type= ni to'g'ri tanlash #

Type=Qachon
simpleDastur old planda qoladi - eng ko'p uchraydigan
execsimple kabi, lekin ishga tushishini kutadi
forkingDastur o'zi fonga o'tadi (eski uslub)
oneshotBir marta ishlaydi va tugaydi (migratsiya, tozalash)
notifyDastur "tayyorman" deb systemd ga xabar beradi
Type=forking - eng ko'p xatoga sabab bo'ladigan tanlov

Zamonaviy dasturlarni fonga o'tkazmang. systemd ning o'zi jarayonni fonda ushlaydi.

Agar dasturingizda --daemon yoki -d bayrog'i bo'lsa, uni ishlatmang va Type=simple qoldiring.

Type=forking ishlatilganda systemd qaysi jarayon asosiy ekanini bilmay qoladi va PIDFile= kerak bo'ladi. Bu esa poyga holatlariga olib keladi: systemd PID faylni yaratilishidan oldin o'qishi mumkin.

Nginx bunga istisno - u haqiqatan ham fork qiladi va Type=forking bilan PIDFile= ishlatadi (17-bo'lim).

Xizmat yiqilganda #

BuyruqNima ko'rsatadi
systemctl status xizmatHolat + oxirgi 10 satr jurnal
systemctl --failedBarcha yiqilgan xizmatlar
journalctl -u xizmat -n 50Batafsil jurnal
journalctl -u xizmat -p errFaqat xatolar
systemctl reset-failed xizmatfailed belgisini tozalash
systemctl show xizmat -p ResultYiqilish sababi
Terminal
systemctl start sr-sinov
sleep 3
systemctl show sr-sinov -p Result -p ExecMainStatus -p NRestarts
Natija
Result=success
NRestarts=0
ExecMainStatus=0
Serverga kirganda birinchi buyruq
Terminal
systemctl --failed

Bu bitta buyruq "nima buzilgan?" degan savolga darhol javob beradi. Ro'yxat bo'sh bo'lsa - systemd darajasida hamma narsa joyida.

Uni serverga kirganda bajariladigan odatiy uchlikka qo'shing:

BuyruqSavol
df -hDisk to'lmaganmi?
systemctl --failedXizmat yiqilmaganmi?
journalctl -p err -bYuklanishdan beri xatolar bormi?
Amaliy topshiriq
  1. Uchta bo'limli minimal unit fayl yozing.
  2. systemd-analyze verify bilan tekshiring.
  3. start qiling va is-active bilan holatni ko'ring.
  4. enable va disable farqini is-enabled bilan tasdiqlang.
  5. journalctl -u bilan ilovaning echo chiqishini toping.
  6. .d/ katalogida Restart=on-failure qo'shing.
  7. systemctl show bilan sozlama qo'llanganini tekshiring.
  8. MemoryMax va User qiymatlarini tasdiqlang.
  9. ProtectSystem=strict qo'ying va ReadWritePaths bilan yozishga ruxsat bering.
  10. systemd-analyze security bilan ballni ko'ring.

Xulosa #

  • [Unit] - munosabat, [Service] - qanday ishlash, [Install] - enable uchun.
  • [Install] bo'lmasa systemctl enable ishlamaydi.
  • start hozir, enable yuklanishda - enable --now ikkalasi.
  • Sozlamani systemd-analyze verify bilan oldindan tekshiring.
  • stdout avtomatik jurnalga tushadi - ilovada fayl jurnali yozmang.
  • Restart=on-failure odatda to'g'ri tanlov; always sikl yaratishi mumkin.
  • Paket unitini tahrirlamang - systemctl edit va .d/ ishlating.
  • Fayl qo'lda o'zgartirilsa - daemon-reload shart.
  • MemoryMax aybdorni cheklaydi, OOMScoreAdjust qurbonni himoyalaydi.
  • Type=forking dan qoching; zamonaviy dastur old planda qolsin.

Keyingi bo'limda jurnalni chuqurroq o'rganamiz: journalctl filtrlari, doimiy saqlash va jurnal aylanishi.

Xatolik topdingizmi?

Imlo xatosi, ishlamaydigan kod yoki noto‘g‘ri ma‘lumotni ko‘rsangiz - bizga xabar bering. Har bir xabar administrator tomonidan ko‘rib chiqiladi.