Michakato kwenye Linux: ps, top, htop, kill, ishara na nice
Michakato ya Linux huonekana kwa amri ya ps aux (picha ya wakati mmoja), top na htop (orodha inayosasishwa yenye mzigo). Husimamishwa kwa amri ya kill PID, ambayo kwa chaguo-msingi hutuma SIGTERM ya kistaarabu; kill -9 (SIGKILL) inahitajika tu mchakato ukikataa kujibu. Kipaumbele huwekwa na nice wakati wa kuanzisha na renice kwa mchakato unaoendelea, kwenye safu kuanzia -20 hadi 19.
Kila programu inayoendeshwa kwenye Linux ni mchakato wenye namba yake ya PID, mmiliki, hali na kipaumbele. Michakato huonekana kwa amri ps, top na htop, husimamishwa kwa amri kill, na kipaumbele chake hubadilishwa kwa nice na renice. Hapa chini tutaangalia jinsi ya kusoma matokeo ya amri hizi, ni ishara gani itumike lini, na kwa nini kill -9 si jibu la kwanza.
Mchakato ni nini na PID ni nini
Mchakato ni programu wakati inatekelezwa: msimbo, kumbukumbu, faili zilizofunguliwa na seti ya sifa. Kernel humpa kila mchakato kitambulisho cha kipekee cha PID, na pia hukumbuka PPID — namba ya mzazi aliyeuanzisha. Mchakato wa kwanza kabisa kwenye mfumo wenye PID 1 kwa kawaida ni systemd, na ndiye «babu» wa wengine wote.
Mchakato mpya huzaliwa kwa hatua mbili. Kwanza mzazi huita fork() na kupata nakala yake, kisha nakala huita execve() na kubadilisha msimbo wake kwa msimbo wa programu mpya. Unapoandika ls kwenye terminal, bash hufanya hasa hivyo na husubiri mtoto amalize kupitia wait().
$ echo $$ # PID ya ganda la sasa
4182
$ ps -o pid,ppid,cmd -p $$
PID PPID CMD
4182 4170 -bash
Kuona michakato kwa amri ya ps
ps huchukua picha ya wakati mmoja: huonyesha michakato kwa wakati ilipoendeshwa kisha huisha. Bila hoja zozote huonyesha michakato ya terminal ya sasa tu, kwa hiyo kwa vitendo karibu kila mara hutumika mojawapo ya chaguo mbili.
$ ps aux | head -5
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.3 168540 12780 ? Ss 09:12 0:03 /sbin/init
root 2 0.0 0.0 0 0 ? S 09:12 0:00 [kthreadd]
www-data 1532 1.2 2.1 412308 86420 ? S 09:15 1:47 php-fpm: pool www
postgres 1610 0.4 3.8 221004 154312 ? Ss 09:15 0:31 postgres: checkpointer
Hapa a ni michakato ya watumiaji wote, u ni muundo wa kina wenye mmiliki, x ni pamoja na michakato isiyo na terminal (daemons). Sintaksia mbadala ya mtindo wa System V ni ps -ef: inaonyesha PPID, jambo linalofaa unapotaka kujua nani amemwanzisha nani.
| Safu | Maana yake |
|---|---|
PID | kitambulisho cha mchakato |
%CPU, %MEM | sehemu ya processor na kumbukumbu ya kimwili |
VSZ | kumbukumbu pepe kwa KB (pamoja na isiyopakiwa kwenye RAM) |
RSS | kumbukumbu halisi ya kimwili inayotumika kwa KB |
STAT | hali ya mchakato (R, S, D, Z, T) na alama |
TIME | jumla ya muda wa processor, si muda wa kuendesha |
Mbinu muhimu na ps
# 10 bora kwa kumbukumbu
ps aux --sort=-%mem | head -11
# 10 bora kwa processor
ps aux --sort=-%cpu | head -11
# safu zako mwenyewe
ps -eo pid,ppid,user,ni,stat,etime,cmd
# mti wa michakato
ps -ef --forest
pstree -p
# tafuta PID kwa jina
pgrep -a nginx
pidof nginx
Kosa la kawaida ni kutafuta mchakato kwa ps aux | grep nginx na kupata grep yenyewe kwenye matokeo. Tumia pgrep au hila ya grep [n]ginx, ambayo haifanani na mstari wake wa amri.
Hali za michakato: R, S, D, Z, T
Herufi kwenye safu ya STAT si kelele, ni hali halisi ya mchakato. Kutoka hapo inategemea jinsi ya kutafsiri mzigo na kama kill itasaidia kabisa.
| Msimbo | Hali | Maana kwa vitendo |
|---|---|---|
R | Running | inatekelezwa au inasubiri foleni ya CPU |
S | Interruptible sleep | inasubiri tukio (mtandao, ingizo, kipima muda); hali ya kawaida ya michakato mingi |
D | Uninterruptible sleep | inasubiri I/O ndani ya kernel, ishara hazifikishwi |
Z | Zombie | imemaliza, lakini mzazi hajachukua msimbo wa kutoka |
T | Stopped | imesimamishwa kwa ishara SIGSTOP au Ctrl+Z |
Alama za ziada baada ya herufi pia zina manufaa: s — kiongozi wa kikao, + — mchakato wa mbele kwenye terminal, < — kipaumbele cha juu, N — kipaumbele cha chini, l — wa nyuzi nyingi (multithreaded).
Mchakato katika hali D
Mchakato wa D uko ndani ya wito wa mfumo na unasubiri, kwa mfano, jibu kutoka diski au NFS iliyokwama. Hakuna ishara yoyote inayomfikia, hata SIGKILL. Kwa hiyo kill -9 haifai hapa: unahitaji kutafuta sababu ya kusubiri — kuangalia iostat, dmesg, hali ya hifadhi ya mtandao.
Michakato ya zombie
Zombie tayari amekufa: haitumii CPU wala kumbukumbu, anachukua tu mstari kwenye jedwali la michakato. Haiwezi kuuawa — tayari amemaliza. Anatoweka mzazi akiita wait(), au mzazi akimaliza mwenyewe na zombie kuchukuliwa na PID 1.
# tafuta zombie na wazazi wao
ps -eo pid,ppid,stat,cmd | awk '$3 ~ /Z/'
Zombie mmoja hana madhara. Zikiwa mamia na idadi ikiongezeka, kuna hitilafu katika programu ya mzazi: inahitaji kurekebishwa au kuanzishwa upya.
top: michakato na mzigo kwa wakati halisi
top huonyesha orodha ile ile, lakini huisasisha kila sekunde chache na hutoa muhtasari wa mfumo. Ndiyo amri ya kwanza wanayoiendesha wakati «seva inachelewa».
top - 14:21:07 up 12 days, 3:02, 2 users, load average: 1.84, 1.20, 0.95
Tasks: 213 total, 2 running, 211 sleeping, 0 stopped, 0 zombie
%Cpu(s): 23.1 us, 4.2 sy, 0.0 ni, 70.3 id, 1.9 wa, 0.0 hi, 0.5 si, 0.0 st
MiB Mem : 7821.4 total, 412.6 free, 3105.8 used, 4303.0 buff/cache
MiB Swap: 2048.0 total, 2048.0 free, 0.0 used. 4398.2 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1532 www-data 20 0 412308 86420 14212 R 38.2 1.1 1:47.31 php-fpm
1610 postgres 20 0 221004 154312 148900 S 6.0 1.9 0:31.08 postgres
Mstari wa %Cpu(s) ndio muhimu zaidi: us — msimbo wa mtumiaji, sy — kernel, id — kutofanya kazi, wa — kusubiri diski. wa ya juu wakati processor iko huru ni ishara wazi kwamba kizuizi ni I/O.
Vitufe vya top
| Kitufe | Kitendo |
|---|---|
P / M | panga kwa CPU / kwa kumbukumbu |
1 | onyesha kila core kivyake |
c | mstari kamili wa amri |
u | chuja kwa mtumiaji |
k | tuma ishara kwa mchakato |
r | badilisha nice ya mchakato |
H | onyesha nyuzi (threads) |
q | toka |
Kwa script na kumbukumbu kuna hali ya batch: top -b -n 1 | head -20 itatoa picha moja bila mwingiliano. Kufuatilia mchakato mmoja — top -p 1532.
Load Average ni foleni, si asilimia
Namba tatu za load average ni wastani wa urefu wa foleni kwa dakika 1, 5 na 15. Kwenye Linux michakato iliyo katika hali R na D huingia humo, lakini usingizi wa kawaida S hauingii. Load average inapaswa kulinganishwa na idadi ya core (nproc): kwenye core 4, thamani 4 ni mzigo kamili, na 12 ni foleni mara tatu ya uwezo.
Ikiwa LA iko juu lakini processor iko bila kazi, tafuta michakato ya D: ps -eo stat,pid,cmd | grep '^D'. Karibu daima ni diski polepole au hifadhi ya mtandao.
htop: mbadala mzuri wa top
htop huonyesha kitu kile kile, lakini kwa viashiria vya rangi kwa kila core, kusogeza, usaidizi wa kipanya na mti wa michakato. Kwa kawaida inabidi kuisakinisha: sudo apt install htop au sudo dnf install htop.
F3au/— tafuta mchakato kwa jina;F4— chujio linalobakiza mlingano tu;F5aut— mti wa «mzazi — watoto»;F6— chagua safu ya kupanga;F7/F8— punguza au ongeza nice;F9— menyu ya ishara kwa mchakato uliochaguliwa;Space— weka alama kwa michakato kadhaa kwa kitendo cha wingi.
Kwenye seva ambazo haziruhusu kusakinisha chochote, top inatosha: shughuli zote kuu zipo humo pia.
Jinsi ya kusimamisha mchakato: kill na ishara
Amri kill haiui kwa kweli, bali hutuma ishara kwa mchakato. Kitakachofuata kinategemea ishara na jinsi programu inavyoishughulikia.
| Ishara | Namba | Kusudi |
|---|---|---|
SIGHUP | 1 | terminal imekatika; daemons nyingi husoma usanidi upya |
SIGINT | 2 | kukatiza, sawa na Ctrl+C |
SIGKILL | 9 | kusimamisha kwa nguvu na kernel, haiwezi kukamatwa |
SIGTERM | 15 | ombi la kumaliza kistaarabu; chaguo-msingi la kill |
SIGSTOP | 19 | kusimamisha, haiwezi kukamatwa |
SIGCONT | 18 | kuendelea na mchakato uliosimamishwa |
SIGTSTP | 20 | kusimamisha kutoka terminal, Ctrl+Z |
Namba zimeonyeshwa kwa x86 na ARM; orodha kamili hutolewa na kill -l. Kuandika ishara kwa jina ni salama zaidi kuliko kwa namba.
kill 1532 # SIGTERM
kill -TERM 1532 # sawa, kwa uwazi
kill -HUP $(pidof nginx) # kusoma usanidi upya
kill -STOP 1532; kill -CONT 1532
kill -0 1532 && echo "mchakato uko hai"
Ishara 0 haituma chochote, inakagua tu kama mchakato upo na kama una ruhusa ya kuuandikia — inafaa kwenye script.
Kwa nini usianze na kill -9
SIGTERM humpa programu nafasi ya kufunga faili, kumwaga buffer, kufuta faili za kufuli na kumaliza miamala kwa usahihi. SIGKILL hukatisha kila kitu papo hapo: data ambazo hazijaandikwa zinapotea, faili za muda zinabaki, na hifadhidata inaweza kuingia kwenye urejeshaji ikianza tena.
Mpangilio sahihi ni huu:
- Tuma
kill PID(SIGTERM). - Subiri sekunde 5–30, ukikagua kwa
kill -0 PID. - Ikiwa mchakato bado uko hai na si katika hali
Dtu —kill -9 PID.
Kwa huduma chini ya systemd ni bora kutogusa PID kwa mkono kabisa: systemctl stop yenyewe hutuma SIGTERM, husubiri muda wa kuisha na kisha SIGKILL.
pkill na killall: kwa jina
pkill -f "python worker.py" # kwa mstari kamili wa amri
pkill -u alice # michakato yote ya mtumiaji
killall -TERM node # michakato yote yenye jina node
pgrep -l -f worker # kwanza hakikisha kitakachoingia kwenye muundo
Kabla ya pkill ya wingi, endesha daima pgrep kwa muundo uleule: -f hulinganisha na sehemu yoyote ya mstari wa amri na inaweza kunasa kisichotakiwa kwa urahisi.
Ishara unaweza kutuma kwa michakato yako tu; ya wengine inahitaji sudo. Hitilafu Operation not permitted inamaanisha hilo hasa.
Kipaumbele cha michakato: nice na renice
Thamani ya nice inamwambia kipanga-ratiba nani aachie processor. Safu ni kuanzia -20 (kipaumbele cha juu kabisa) hadi 19 (inawaachia wote), chaguo-msingi ni 0. Kwenye top inaonekana kwenye safu ya NI, na PR ni kipaumbele cha ndani kinachotokana nayo.
# kuanzisha kazi nzito kwa kipaumbele cha chini
nice -n 10 tar czf backup.tar.gz /var/www
# kupunguza kipaumbele cha mchakato unaoendelea
renice -n 15 -p 1532
# kuongeza (root pekee)
sudo renice -n -5 -p 1610
# michakato yote ya mtumiaji
sudo renice -n 10 -u alice
Mtumiaji wa kawaida anaweza tu kupunguza kipaumbele cha michakato yake, thamani hasi zinapatikana kwa root pekee. Ni muhimu kuelewa mipaka ya nice: huathiri CPU pekee. Ikiwa kazi inaupunguzia mfumo kasi kwa diski, tumia ionice -c3 amri — darasa la idle linalopata diski pale tu isipohitajika na mtu mwingine.
Michakato ya chinichini na kazi za ganda
Amri inaweza kuendeshwa chinichini kwa kuongeza &, au kusimamishwa kwa Ctrl+Z. Ganda linaweka orodha ya kazi, zinazosimamiwa na amri za ndani.
$ long_task &
[1] 5120
$ jobs
[1]+ Running long_task &
$ fg %1 # rudisha mbele
^Z # simamisha (SIGTSTP)
$ bg %1 # endelea chinichini
Terminal inapofungwa, ganda hutuma SIGHUP kwa kazi zake, nazo zinamaliza. Ili mchakato uishi baada ya kutoka, uzindue kwa nohup amri &, uutenganishe kwa disown, au tumia tmux. Kwa kazi ya kudumu ni sahihi zaidi kuifanya huduma ya systemd.
Hali za kawaida za uchunguzi
Nani anakula processor
top -o %CPU # au P ndani ya top
ps -eo pid,user,%cpu,etime,cmd --sort=-%cpu | head
Ikiwa mchakato unatumia CPU bila faida, kwanza punguza kipaumbele chake kwa renice — ni salama na inakupa muda wa kuchunguza.
Nani ameshika port
sudo ss -ltnp | grep :8080
sudo lsof -i :8080
Matokeo yataonyesha PID, na kwa PID hiyo ndani ya /proc/PID/ unaweza kupata faili inayotekelezwa (exe), saraka ya kazi (cwd) na hoja (cmdline).
Mchakato umetoweka ghafla
Sababu ya kawaida ni OOM Killer, anayeua michakato kumbukumbu inapokosekana. Ukaguzi: dmesg -T | grep -i oom au journalctl -k | grep -i "killed process".
Muhtasari
Kwa kazi na michakato ya Linux, seti ndogo ya amri inatosha: ps aux kwa picha, top na htop kwa uangalizi, kill kwa ishara sahihi ya kusimamisha, na nice/renice kwa vipaumbele. Soma hali ya mchakato kabla ya kuchukua hatua: zombie na michakato ya D hayatibiwi kwa ishara. Anza na SIGTERM, na uache kill -9 kwa dharura ya mwisho. Michakato, kumbukumbu, Load Average na miito ya mfumo imefafanuliwa kwa vitendo katika kozi ya Linux.
Maswali ya mara kwa mara
ps aux inatofautianaje na ps -ef?
Ni sintaksia mbili za amri moja: aux ni mtindo wa BSD wenye safu za %CPU, %MEM na STAT, -ef ni mtindo wa System V wenye safu ya PPID. Seti ya michakato ni ile ile — michakato yote ya mfumo.
Nitajuaje michakato mingapi inaendeshwa kwenye mfumo?
Njia rahisi ni kuangalia mstari wa Tasks kwenye top, au kuendesha ps -e --no-headers | wc -l. Idadi ya nyuzi itaonyeshwa na ps -eLf --no-headers | wc -l.
Kwa nini mchakato hausimami hata baada ya kill -9?
Ama uko katika hali D na unasubiri I/O ndani ya kernel, au ni zombie ambaye tayari amemaliza. Katika kesi ya kwanza tafuta tatizo la diski au hifadhi ya mtandao, katika ya pili rekebisha au anzisha upya mzazi.
Itakuwaje ukiua mchakato wenye PID 1?
Kernel inalinda init: ishara za kawaida, ikiwemo SIGKILL kutoka kwa mtumiaji, hazimfikii isipokuwa ayashughulikie. Lakini init ikimaliza, mfumo utaingia kwenye kernel panic.
Ninawezaje kupunguza kiasi cha kumbukumbu ambacho mchakato unaweza kutumia?
Kwa huduma ya systemd weka MemoryMax= kwenye faili ya unit; kwa uzinduzi wa mara moja tumia systemd-run --scope -p MemoryMax=500M amri. Hii inatumia cgroups na ni ya kuaminika zaidi kuliko ulimit -v ya zamani.
Mada hii inafundishwa kwa kina pamoja na mazoezi katika kozi “Linux: с нуля до уверенного администрирования”.
Nenda kwenye kozi