systemd troubleshooting
Shu paytgacha ko'rilgan barcha vositalar — Xizmatlarni boshqarish, O'z systemd xizmatini yaratish va journalctl — endi bitta amaliy maqsad uchun birlashadi: xizmat nega kutilganidek ishlamayotganini sinov va xato yo'li bilan emas, tizimli ravishda aniqlash. Bu maqola tasodifiy taxminlarga emas, aniq ketma-ketlikka asoslangan diagnostika yondashuvini ko'rsatadi — ishdan chiqqan unit’larni topishdan tortib boot vaqtini tahlil qilish va bog'liqlik muammolarini aniqlashgacha.
Nimalarni o'rganasiz
Bu maqola oxirida siz quyidagilarni qila olasiz:
- tizimdagi barcha ishdan chiqqan unit’larni
systemctl --failedbilan bir yo'la ko'rish; systemctl statusdagi chiqish kodi va signal ma’lumotlarini o'qib, ehtimoliy sababni aniqlash;- boot vaqtini
systemd-analyze blamevacritical-chainbilan tahlil qilish; - unit bog'liqliklarini
systemctl list-dependenciesbilan ko'zdan kechirish; - xizmat nosozligini aniqlash uchun izchil, bosqichma-bosqich jarayonni qo'llash.
Ishdan chiqqan unit’larni topish
Nechta xizmatda muammo borligini va qaysilarida ekanini ko'rishning eng tez usuli:
UNIT LOAD ACTIVE SUB DESCRIPTION
● backend-demo.service loaded failed failed Backend demo application
LOAD = Reflects whether the unit definition was properly loaded.
ACTIVE = The high-level unit activation state, i.e. generalization of SUB.
SUB = The low-level unit activation state, values depend on unit type.
1 loaded units listed.
Bu buyruq systemctl list-units --state=failed ning qisqa shakli. Xizmatlarni boshqarish maqolasidagi is-failed bitta unit uchun ishlaganidek, --failed butun tizim bo'yicha umumiy ko'rinishni beradi. Aniq bo'lmagan muammo paydo bo'lganda har doim birinchi buyruq aynan shu bo'lishi kerak.
Diagnostika jarayoni, bosqichma-bosqich
Ishdan chiqqan unit topilgach, odatda quyidagi ketma-ketlik sababni aniqlab beradi:
flowchart TD
A["systemctl --failed"] --> B["systemctl status <unit>"]
B --> C["journalctl -u <unit> -n 50"]
C --> D{"Is the cause clear?"}
D -->|No| E["systemctl list-dependencies <unit>"]
D -->|Yes| F["Fix and restart"]
E --> F
1-qadam: systemctl status bilan umumiy ko'rinish
● backend-demo.service - Backend demo application
Loaded: loaded (/etc/systemd/system/backend-demo.service; enabled; preset: enabled)
Active: failed (Result: exit-code) since Fri 2026-07-24 12:01:15 UTC; 30s ago
Process: 7120 ExecStart=/usr/bin/python3 /opt/backend-demo/app.py (code=exited, status=1/FAILURE)
Main PID: 7120 (code=exited, status=1/FAILURE)
Bu yerda eng ko'p ma’lumot beradigan ikki maydon bor:
Result:— systemd nuqtai nazaridan nosozlikning umumiy toifasi (exit-code,signal,timeoutva boshqalar);code=/status=— jarayonning aniq chiqish shakli:exited(oddiy chiqish,status=chiqish kodini beradi) yokikilled(signal bilan tugatilgan,status=signal nomini beradi, masalan9/KILL).
Result qiymati |
Ma’nosi |
|---|---|
exit-code |
Jarayon o'zi noldan farqli kod bilan chiqdi (dastur ichidagi xato) |
signal |
Jarayon signal bilan tugatildi (masalan, SIGKILL, SIGSEGV) |
timeout |
TimeoutStartSec= yoki TimeoutStopSec= ichida javob bermadi |
resources |
Jarayon uchun resurs ajratish muammosi (masalan, xotira yetishmasligi) |
Result: exit-code dasturning o'z mantiqidan emas, systemd jarayonni hatto ishga tushira olmaganidan kelib chiqsa, status= raqami sababni to'g'ridan-to'g'ri nomlaydigan maxsus systemd exec kodi bo'ladi:
status= |
Nomi | Nima noto'g'ri ketdi |
|---|---|---|
203/EXEC |
EXEC | ExecStart= dagi binary faylni ishga tushirib bo'lmadi — noto'g'ri yo'l, bajarish huquqi yo'q yoki interpretator qatori noto'g'ri |
200/CHDIR |
CHDIR | WorkingDirectory= mavjud emas yoki unga kirib bo'lmaydi |
217/USER |
USER | User=/Group= hisobi mavjud emas |
226/NAMESPACE |
NAMESPACE | Sandboxing direktivasini sozlab bo'lmadi — masalan, ProtectSystem=strict ostida ReadWritePaths= dagi yo'l mavjud emas |
Bu to'rttasi "yangi yaratgan unit’im ishga tushmayapti" holatlarining katta qismini ilova log'idan bitta qator ham o'qimasdan hal qiladi — raqam to'g'ridan-to'g'ri aybdor direktivani ko'rsatadi. Oddiy ilova xatosi (Python traceback, noto'g'ri konfiguratsiya qiymati) esa aksincha, dasturning o'z kodi bilan (ko'pincha 1/FAILURE) chiqadi va keyingi qadamda o'qiladi.
Hech kim qo'lda o'ldirmagan, lekin status=9/KILL bilan killed deb ko'rsatilgan jarayon ko'pincha OOM killer ishi bo'ladi. Buni kernel log'ida tasdiqlang:
Yangi systemd versiyalarida holat qatorining o'zida Result: oom-kill yozilishi mumkin va bu taxmin qilish zaruratini yo'qotadi.
2-qadam: to'liq xabarni journalctl bilan o'qish
systemctl status faqat oxirgi bir necha qatorni ko'rsatadi. To'liq kontekst uchun journalctl maqolasida ko'rilgan filtrlashdan foydalaning:
Ko'pincha haqiqiy sabab aynan shu yerda — ilovaning o'z xato xabarida (Python traceback, "Address already in use") yashiringan bo'ladi, systemctl status esa faqat systemd nuqtai nazaridan natijani ko'rsatadi.
3-qadam: bog'liqliklarni tekshirish
Agar unit’ning o'zi joyida ko'rinsa-yu, lekin kutilgan paytda ishga tushmasa yoki kutilmagan tartibda ishlasa, muammo bog'liqlikda bo'lishi mumkin:
Bu buyruq systemd unitlari va targetlari maqolasida ko'rilgan Wants=/Requires= direktivalarining haqiqiy natijasini daraxt ko'rinishida ko'rsatadi — qaysi unit qaysi biriga bog'liqligini ko'z bilan tekshirishning qulay usuli.
Boot vaqtini tahlil qilish: systemd-analyze
Agar muammo aynan boot paytida bo'lsa va biror unit boot vaqtini keragidan ortiq cho'zayotgan bo'lsa, maxsus vosita ishlatiladi.
Umumiy boot vaqti:
Qaysi unit eng ko'p vaqt olganini ko'rish:
blame unit’larni har biri o'zi ishga tushishi uchun ketgan vaqt bo'yicha kamayish tartibida ro'yxatlaydi — ro'yxat tepasidagi unit boot’ni sekinlashtirayotgan asosiy nomzod.
Eng uzun ketma-ket bog'liqlik zanjirini ko'rish:
graphical.target @9.912s
└─multi-user.target @9.910s
└─backend-demo.service @4.707s +5.203s
└─network.target @4.703s
└─network-online.target @4.701s
blame unit’ning o'zi qancha vaqt olganini ko'rsatadi; critical-chain esa target’ga yetish uchun ketma-ket kutilishi kerak bo'lgan unit’larning eng uzun yo'lini ko'rsatadi. Ikkalasi turli savollarga javob beradi, shuning uchun ularni birga ishlatishga arziydi.
Info
systemd-analyze blame tepasidagi unit har doim ham haqiqiy aybdor bo'lavermaydi — masalan, network-online.target ni kutayotgan unit o'zi hech qanday og'ir ish qilmasa ham uzoq vaqt olayotgandek ko'rinishi mumkin. critical-chain bu farqni aniqroq ko'rsatadi.
Barcha xatolarni bir yo'la ko'rib chiqish
Bu journalctl maqolasidagi -p (priority) filtrini joriy boot bilan birlashtirib, faqat err darajasidagi va undan jiddiyroq yozuvlarni ko'rsatadi. Bir nechta unit bir vaqtda noto'g'ri ishlayotganda barcha muammolarni bir yo'la ko'rish uchun foydali.
Keng tarqalgan xatolar
systemctl status ni yetarli deb hisoblash
status faqat qisqa xulosa beradi. Haqiqiy sabab (masalan, ilova ichidagi to'liq xato matni) ko'pincha faqat journalctl -u <unit> orqali ko'rinadi.
Result: exit-code va Result: signal ni bir xil narsa deb hisoblash
exit-code dasturning o'zi xato bilan tugaganini (masalan, noto'g'ri konfiguratsiya), signal esa uni tashqi kuch (kill, OOM killer) tugatganini bildiradi. Ularning sabablari va yechimlari butunlay boshqacha — birinchisi kodni tekshirishni, ikkinchisi tizim resurslari yoki tashqi ta’sirni tekshirishni talab qiladi.
Bog'liqliklarini tekshirmasdan unit’ni qayta-qayta ishga tushirish
Agar muammo unit’ning o'zida emas, u bog'liq bo'lgan boshqa unit’da bo'lsa (masalan, tarmoq hali tayyor emas), faqat shu bitta unit’ni qayta ishga tushirish vaqtincha yordam berishi mumkin, lekin asl sabab qoladi. systemctl list-dependencies bilan tekshirish bu siklni uzadi.
Mashqlar
- Sinov VM’ida ataylab
ExecStart=yo'li buzilgan (mavjud bo'lmagan faylga ishora qiluvchi) unit yarating,daemon-reloadvastartni ishga tushiring, so'ng sababnisystemctl --failedvajournalctl -uyordamida toping. systemd-analyze blamedagi eng sekin uchta unit’ni qayd qiling va har biri nega shuncha vaqt olayotgan bo'lishi mumkinligini baholang.systemd-analyze critical-chainchiqishini o'qing vagraphical.target(yokimulti-user.target) gacha bo'lgan eng uzun ketma-ket yo'lni tasvirlab bering.- Ataylab buzilgan unit’ning
ExecStart=yo'lini tuzating va usystemctl --failedro'yxatidan yo'qolganini tasdiqlang.
Mashqni bajardim deyish uchun: ishdan chiqqan unit’ning systemctl status chiqishi berilganda keyingi qadam ilovaning o'z log'ini o'qishmi yoki uning bog'liqliklarini tekshirishmi — buni ayta olishingiz kerak.
Xulosa
systemd nosozligini aniqlash taxmin emas, izchil jarayon: avval systemctl --failed bilan qaysi unit ishdan chiqayotganini aniqlang, so'ng systemctl status bilan natijaning umumiy turini (exit-code yoki signal) tekshiring, keyin journalctl -u bilan to'liq xato matnini o'qing va kerak bo'lsa systemctl list-dependencies bilan bog'liqliklarni tekshiring. Aynan boot vaqti muammolari uchun systemd-analyze blame/critical-chain — maxsus, aniq maqsadli vositalar. Agar muammo shunchalik jiddiy bo'lsaki, tizim umuman boot qilmasa, keyingi maqola — Rescue va emergency mode da ko'riladigan minimal tiklash rejimlari kerak bo'ladi.