PID — operatsion tizim tomonidan har bir processga beriladigan raqamli identifikator. Uning to‘liq nomi Process Identifier hisoblanadi.
Kernel PID orqali process holatini, signal yuborishni, resource accounting va parent-child munosabatlarini boshqaradi.
PID processning doimiy identifikatori emas. Process tugagach, uning raqami keyinchalik boshqa processga qayta berilishi mumkin.
PID diapazoni
PIDlar musbat butun sonlardan iborat.
Maksimal qiymat operatsion tizim va konfiguratsiyaga bog‘liq.
Linuxda pid_max parametri mavjud. PIDlar aylana tartibda qayta ishlatiladi, lekin kernel hali mavjud processga tegishli raqamni bermaydi.
PID 1
Unix-like tizimda PID 1 alohida ahamiyatga ega.
U birinchi user-space process bo‘lib, kernel tomonidan ishga tushiriladi.
Vazifalari:
- system service’larni boshlash;
- orphan processlarni qabul qilish;
- zombie childlarni yig‘ish;
- shutdown va rebootni boshqarish;
- boot targetga o‘tish.
Zamonaviy Linuxda PID 1 ko‘pincha systemd.
PID 0
PID 0 oddiy user process emas.
Kernel ichidagi scheduler yoki swapper bilan bog‘liq maxsus identifikator sifatida ishlatilishi mumkin.
Unga oddiy signal yuborilmaydi va process ro‘yxatida standart user process kabi ko‘rinmasligi mumkin.
Parent PID
Har process parent process identifikatoriga ega.
Bu PPID deb ataladi.
Shell command ishga tushirganda shell parent, command child bo‘ladi.
Process daraxti:
systemd (PID 1)
└── sshd
└── shell
└── application
Process yaratish
Unixda fork() yangi child yaratadi.
Child yangi PID oladi, parent PID saqlanadi.
Keyin exec() child process image’ni boshqa dastur bilan almashtirishi mumkin. PID o‘zgarmaydi.
PIDni topish
Vositalar:
ps;pgrep;pidof;- service manager;
/proc;- application status endpoint.
Process nomi bir nechta instance’da takrorlanishi mumkin. PID aniq instance’ni ko‘rsatadi.
/proc filesystem
Linuxda har process uchun:
/proc/<PID>/
katalog mavjud.
Unda:
- command line;
- environment;
- open file;
- memory map;
- status;
- current directory;
- executable link;
- threadlar;
- namespace
haqida ma’lumot bo‘ladi.
Permission boshqa user process ma’lumotini cheklashi mumkin.
Signal yuborish
kill nomiga qaramay, faqat processni tugatish uchun emas, signal yuborish uchun ishlatiladi.
Misollar:
kill -TERM 1234
kill -HUP 1234
kill -KILL 1234
Signal yuborishdan oldin PID to‘g‘ri processga tegishli ekanini tekshirish kerak.
PID reuse xavfi
Monitoring tizimi eski PIDni saqlab qoladi. Process tugaydi va shu PID boshqa processga beriladi. Keyin noto‘g‘ri processga signal yuborilishi mumkin.
Yechimlar:
- process start time;
- pidfd;
- service manager;
- executable identity;
- namespace;
- application-specific control socket.
PID file
Klassik daemon o‘z PIDini faylga yozadi.
Misol:
/run/nginx.pid
Management script shu fayldan PID oladi.
Muammolar:
- stale PID file;
- permission;
- PID reuse;
- yozuv atomik emas;
- process crash.
Systemd processni cgroup orqali kuzatgani sabab PID filega ehtiyoj kamayadi.
pidfd
Linux pidfd processga file descriptorga o‘xshash barqaror handle beradi.
PID qayta ishlatilsa ham pidfd eski process identifikatsiyasini aralashtirmaydi.
U orqali:
mumkin.
Thread ID
Linuxda har thread kernel task IDga ega.
Main threadning TIDi process PIDiga teng.
Boshqa threadlar alohida TID oladi.
Process darajasidagi TGID barcha threadlar uchun umumiy process identifikatorini bildiradi.
Process group ID
Bir nechta process bitta process groupga kiradi.
PGID terminal job control uchun ishlatiladi.
Shell pipeline’dagi processlar bir groupga joylashtirilishi mumkin.
Signal butun groupga yuboriladi.
Session ID
Session bir nechta process groupni birlashtiradi.
SID session leader PIDiga teng bo‘lishi mumkin.
Terminal foreground va background joblarni session hamda group orqali boshqaradi.
PID namespace
Container alohida PID namespace’ga ega.
Container ichidagi process PID 1 bo‘lib ko‘rinishi, hostda esa masalan PID 28450 bo‘lishi mumkin.
Bir process turli nested namespace’da turli PID bilan ko‘rinadi.
Container PID 1
Containerdagi PID 1 signal va zombie processlarni to‘g‘ri boshqarishi kerak.
Application child process yaratib, ularni wait() qilmasa zombie ko‘payadi.
Tini yoki dumb-init kabi minimal init ishlatilishi mumkin.
Permission
Signal yuborish uchun user huquqi kerak.
Odatda:
- process owner;
- root;
- tegishli capability
ruxsat oladi.
PIDni bilish processni boshqarish huquqini avtomatik bermaydi.
Monitoring
PID bilan birga:
kuzatiladi.
Process restart qilsa PID o‘zgaradi. Monitoring service identity’ga tayanadi.
Diagnostika
PIDga bog‘liq muammoda:
- process mavjudligi;
- start time;
- PID file;
- PPID;
- zombie;
- namespace;
- cgroup;
- signal permission;
- PID reuse
tekshiriladi.
No such process PID tugaganini yoki boshqa namespace’da ekanini bildirishi mumkin.
PID va service boshqaruvi
Service manager processni faqat raqam bilan emas, cgroup va unit orqali kuzatadi. Daemon fork qilib yangi PID olsa ham, child processlar shu service tarkibida qoladi.
Bu yondashuv:
- stale PID file muammosini kamaytiradi;
- barcha child processni birga to‘xtatadi;
- resource limitni guruhga qo‘llaydi;
- restartni aniq boshqaradi.
PIDni scriptda ishlatish
Script PIDni topib, keyin signal yuborguncha process tugashi mumkin. Tekshiruv bilan amal orasidagi bu vaqt race condition yaratadi.
Mumkin bo‘lsa service manager, pidfd yoki processning boshqaruv socketidan foydalaniladi. Faqat pgrep natijasining birinchi qatoriga ko‘r-ko‘rona signal yuborilmaydi.
Bog‘liq tushunchalar
Process, PPID, PID 1, Thread ID, Process group, Session, Signal, PID file, pidfd, PID namespace