Mwongozo

Michakato kwenye Linux: ps, top, htop, kill, ishara na nice

Imesasishwa: · Skillaria.Top

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.

SafuMaana yake
PIDkitambulisho cha mchakato
%CPU, %MEMsehemu ya processor na kumbukumbu ya kimwili
VSZkumbukumbu pepe kwa KB (pamoja na isiyopakiwa kwenye RAM)
RSSkumbukumbu halisi ya kimwili inayotumika kwa KB
STAThali ya mchakato (R, S, D, Z, T) na alama
TIMEjumla 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.

MsimboHaliMaana kwa vitendo
RRunninginatekelezwa au inasubiri foleni ya CPU
SInterruptible sleepinasubiri tukio (mtandao, ingizo, kipima muda); hali ya kawaida ya michakato mingi
DUninterruptible sleepinasubiri I/O ndani ya kernel, ishara hazifikishwi
ZZombieimemaliza, lakini mzazi hajachukua msimbo wa kutoka
TStoppedimesimamishwa 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

KitufeKitendo
P / Mpanga kwa CPU / kwa kumbukumbu
1onyesha kila core kivyake
cmstari kamili wa amri
uchuja kwa mtumiaji
ktuma ishara kwa mchakato
rbadilisha nice ya mchakato
Honyesha nyuzi (threads)
qtoka

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.

  • F3 au / — tafuta mchakato kwa jina;
  • F4 — chujio linalobakiza mlingano tu;
  • F5 au t — 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.

IsharaNambaKusudi
SIGHUP1terminal imekatika; daemons nyingi husoma usanidi upya
SIGINT2kukatiza, sawa na Ctrl+C
SIGKILL9kusimamisha kwa nguvu na kernel, haiwezi kukamatwa
SIGTERM15ombi la kumaliza kistaarabu; chaguo-msingi la kill
SIGSTOP19kusimamisha, haiwezi kukamatwa
SIGCONT18kuendelea na mchakato uliosimamishwa
SIGTSTP20kusimamisha 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:

  1. Tuma kill PID (SIGTERM).
  2. Subiri sekunde 5–30, ukikagua kwa kill -0 PID.
  3. Ikiwa mchakato bado uko hai na si katika hali D tu — 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.

Jifunze mada hii kwa video

Mada hii inafundishwa kwa kina pamoja na mazoezi katika kozi “Linux: с нуля до уверенного администрирования”.

Nenda kwenye kozi