Bosh sahifa Wiki PID

PID

PIDoperatsion 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:

PID file

Klassik daemon o‘z PIDini faylga yozadi.

Misol:

/run/nginx.pid

Management script shu fayldan PID oladi.

Muammolar:

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:

  • signal yuborish;
  • process tugashini kutish;
  • event loopda kuzatish

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:

  • start time;
  • command;
  • user;
  • parent;
  • cgroup;
  • CPU;
  • memory;
  • open files;
  • thread count

kuzatiladi.

Process restart qilsa PID o‘zgaradi. Monitoring service identity’ga tayanadi.

Diagnostika

PIDga bog‘liq muammoda:

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