Ukusasazwa kwesoftware nge-strace

Ukusasazwa kwesoftware nge-strace

Umsebenzi wam wosuku ubukhulu becala kukusasazwa kwesoftware, okuthetha ukuba ndichitha ixesha elininzi ndizama ukuphendula imibuzo efana nale:

  • Le software isebenzela umphuhlisi, kodwa hayi kum. Ngoba?
  • Izolo le software indisebenzele, kodwa namhlanje ayisebenzi. Ngoba?

Olu luhlobo lolungiso lweempazamo olwahluke kancinane kulungiso lwesoftware oluqhelekileyo. Ukulungiswa rhoqo kumalunga nengqiqo yekhowudi, kodwa ukulungiswa kokuthunyelwa kumalunga nokusebenzisana phakathi kwekhowudi kunye nokusingqongileyo. Nokuba ingcambu yengxaki iyimposiso enengqiqo, into yokuba yonke into isebenza kumatshini omnye hayi komnye ithetha ukuba ingxaki ngandlel’ ithile ikwimekobume.

Ke endaweni yezixhobo eziqhelekileyo zokulungisa iimpazamo ezifana gdb Ndineseti eyahlukileyo yezixhobo zokusasazwa kwe-debugging. Kwaye isixhobo sam endisithandayo sokujongana nengxaki efana nokuba "Kutheni le software ingandisebenzeli?" ebizwa umtya.

Yintoni umtya?

umtya sisixhobo “sesixokelelwano sokulandela umnxeba”. Yayidalelwe iLinux ekuqaleni, kodwa amaqhinga afanayo okucoca anokwenziwa ngezixhobo zezinye iinkqubo (DTrace okanye ktrace).

Isicelo esisisiseko silula kakhulu. Ufuna nje ukuqhuba umtya ngawo nawuphi na umyalelo kwaye iya kulahla zonke iifowuni zenkqubo (nangona kuqala kuya kufuneka uyifakele ngokwakho. umtya):

$ strace echo Hello
...Snip lots of stuff...
write(1, "Hellon", 6)                  = 6
close(1)                                = 0
close(2)                                = 0
exit_group(0)                           = ?
+++ exited with 0 +++

Zeziphi ezi fowuni zenkqubo? Le yinto efana ne-API ye-kernel yenkqubo yokusebenza. Kudala, isoftware yayinokufikelela ngokuthe ngqo kwihardware eyayisebenza kuyo. Ukuba, umzekelo, bekufuneka ibonise into ethile kwiscreen, idlale ngamazibuko okanye iirejista ezifakwe kwimemori yezixhobo zevidiyo. Xa iinkqubo zekhompyuter zemisebenzi emininzi zaye zaduma, kwabakho isiphithiphithi njengoko izicelo ezahlukeneyo zisilwa kwihardware. Iimpazamo kwisicelo esinye zinokuthoba ezinye, ukuba akunjalo inkqubo iyonke. Emva koko iindlela zamalungelo (okanye "ukhuseleko lweringi") zavela kwi-CPU. I-kernel yaba lelona lungelo likhethekileyo: ifumene ukufikelela okupheleleyo kwi-hardware, ivelisa izicelo ezingaphantsi kwamalungelo esele kufuneka zicele ukufikelela kwi-kernel ukusebenzisana ne-hardware ngokusebenzisa iifowuni zenkqubo.

Kwinqanaba lokubini, umnxeba wenkqubo yahluke kancinane kwifowuni elula, kodwa uninzi lweenkqubo zisebenzisa isisonga kwilayibrari eqhelekileyo. Ezo. i POSIX C ilayibrari esemgangathweni iqulathe umsebenzi wokufowuna bhala (), equlethe yonke ikhowudi yolwakhiwo oluthile lwefowuni yesixokelelwano bhala.

Ukusasazwa kwesoftware nge-strace

Ngamafutshane, nayiphi na intsebenziswano phakathi kwesicelo kunye nokusingqongileyo (iinkqubo zekhompyutheni) zenziwa ngeefowuni zenkqubo. Ke ngoko, xa isoftware isebenza kumatshini omnye kodwa hayi komnye, kuya kuba kuhle ukujonga iziphumo zokulandelela umnxeba wenkqubo. Ngokuthe ngqo, nalu uluhlu lwamanqaku aqhelekileyo anokuthi ahlalutywe kusetyenziswa umkhondo womnxeba wenkqubo:

  • I-Console I/O
  • Uthungelwano I/O
  • Ufikelelo kwinkqubo yefayile kunye nefayile ye I/O
  • Ukulawula ubomi bomsonto wenkqubo
  • Ulawulo lwenkumbulo ephantsi
  • Ukufikelela kubaqhubi besixhobo esithile

Kusetyenziswa nini umtya?

Kwithiyori, umtya isetyenziswa nayo nayiphi na inkqubo kwindawo yomsebenzisi, kuba nayiphi na inkqubo kwindawo yomsebenzisi kufuneka yenze iminxeba yenkqubo. Isebenza ngokufanelekileyo ngakumbi ngeenkqubo ezihlanganisiweyo, ezikumgangatho ophantsi, kodwa ikwasebenza neelwimi ezikumgangatho ophezulu njengePython ukuba unokunqumla ingxolo eyongezelelweyo ukusuka kwixesha lokubaleka kunye netoliki.

Kubo bonke ubuqaqawuli bayo umtya izibonakalisa ngexesha lokulungiswa kwesoftware esebenza kakuhle kumatshini omnye, kodwa ngequbuliso iyeke ukusebenza komnye, ivelise imiyalezo engacacanga malunga neefayile, iimvume, okanye iinzame ezingaphumeleliyo zokuphumeza imiyalelo ethile okanye enye into... Kulusizi, kodwa ayenzi njalo. dibanisa kakuhle kakhulu kunye neengxaki ezikwinqanaba eliphezulu ezifana neempazamo zoqinisekiso lwesatifikethi. Ngokuqhelekileyo oku kufuna indibaniselwano umtyangamaxesha athile i-ltrace kunye nezixhobo zomgangatho ophezulu (njengesixhobo somgca womyalelo kuvulwa ukulungisa isiqinisekiso).

Siza kusebenzisa iseva ezimeleyo njengomzekelo, kodwa umkhondo wefowuni wenkqubo uhlala usenziwa kumaqonga osasazo anzima ngakumbi. Kufuneka nje ukhethe izixhobo ezifanelekileyo.

Umzekelo wokulungisa iimpazamo

Masithi ufuna ukwenza umncedisi wesicelo omangalisayo foo, kwaye yile nto ugqiba ngayo:

$ foo
Error opening configuration file: No such file or directory

Kuyabonakala ukuba ayifumenanga ifayile yoqwalaselo oyibhalileyo. Oku kwenzeka kuba ngamanye amaxesha xa abaphathi bephakheji beqokelela isicelo, babhala ngaphezulu kweendawo ezilindelekileyo zeefayile. Kwaye ukuba ulandela isikhokelo sofakelo kunikezelo olunye, kwenye ufumana iifayile ezihluke ngokupheleleyo apho ubulindele. Ingxaki ingasonjululwa kwimizuzwana embalwa ukuba umyalezo wemposiso uxelelwe ukuba ujonge phi ifayile yoqwalaselo, kodwa ayenzi njalo. Ngoko ujonge phi?

Ukuba unokufikelela kwikhowudi yomthombo, ungayifunda kwaye ufumane yonke into. Isicwangciso esilungileyo sokugcina, kodwa ayisosisombululo esikhawulezayo. Ungabhenela kwinyathelo ngenyathelo debugger efana gdb kwaye ubone ukuba le nkqubo yenza ntoni, kodwa isebenza ngakumbi ukusebenzisa isixhobo esenzelwe ukubonisa intsebenziswano kunye nokusingqongileyo: umtya.

isiphelo umtya isenokubonakala iyimfuneko, kodwa iindaba ezimnandi zezokuba uninzi lwayo lunokungahoywa ngokukhuselekileyo. Kuhlala kuluncedo ukusebenzisa i -o umsebenzisi ukugcina iziphumo zomkhondo kwifayile eyahlukileyo:

$ strace -o /tmp/trace foo
Error opening configuration file: No such file or directory
$ cat /tmp/trace
execve("foo", ["foo"], 0x7ffce98dc010 /* 16 vars */) = 0
brk(NULL)                               = 0x56363b3fb000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=25186, ...}) = 0
mmap(NULL, 25186, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f2f12cf1000
close(3)                                = 0
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "177ELF2113 3 > 1 260A2 "..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=1824496, ...}) = 0
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f2f12cef000
mmap(NULL, 1837056, PROT_READ, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f2f12b2e000
mprotect(0x7f2f12b50000, 1658880, PROT_NONE) = 0
mmap(0x7f2f12b50000, 1343488, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x22000) = 0x7f2f12b50000
mmap(0x7f2f12c98000, 311296, PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x16a000) = 0x7f2f12c98000
mmap(0x7f2f12ce5000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1b6000) = 0x7f2f12ce5000
mmap(0x7f2f12ceb000, 14336, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f2f12ceb000
close(3)                                = 0
arch_prctl(ARCH_SET_FS, 0x7f2f12cf0500) = 0
mprotect(0x7f2f12ce5000, 16384, PROT_READ) = 0
mprotect(0x56363b08b000, 4096, PROT_READ) = 0
mprotect(0x7f2f12d1f000, 4096, PROT_READ) = 0
munmap(0x7f2f12cf1000, 25186)           = 0
openat(AT_FDCWD, "/etc/foo/config.json", O_RDONLY) = -1 ENOENT (No such file or directory)
dup(2)                                  = 3
fcntl(3, F_GETFL)                       = 0x2 (flags O_RDWR)
brk(NULL)                               = 0x56363b3fb000
brk(0x56363b41c000)                     = 0x56363b41c000
fstat(3, {st_mode=S_IFCHR|0620, st_rdev=makedev(0x88, 0x8), ...}) = 0
write(3, "Error opening configuration file"..., 60) = 60
close(3)                                = 0
exit_group(1)                           = ?
+++ exited with 1 +++

Phantse lonke iphepha lokuqala lemveliso umtya - Oku kudla ngokuba kukwinqanaba eliphantsi lolungiselelo lokuqaliswa. (Iminxeba emininzi imaphu, ukukhusela, quill kwizinto ezinjengokubona inkumbulo ekwinqanaba elisezantsi kunye nokubonisa amathala eencwadi aguqukayo.) Ngokwenyani, ngexesha lokulungisa imveliso umtya Kungcono ukufunda ukusuka ekugqibeleni. Kuya kubakho umngeni apha ngezantsi bhala, ebonisa umyalezo wemposiso. Sijonge ngasentla kwaye sibona umnxeba wokuqala wenkqubo engalunganga - umnxeba openat, ephosa impazamo ENOENT (“ifayile okanye uvimba weefayili awufunyenwanga”) uzama ukuvula /etc/foo/config.json. Apha kulapho ifayile yoqwalaselo kufuneka ibekho.

Lo ibingumzekelo nje, kodwa bendinokuthi ngama-90% exesha endilisebenzisayo umtya, akukho nto inzima kakhulu ukuyenza ngaphezu koku. Apha ngezantsi sisikhokelo esipheleleyo sokulungisa ingxaki:

  • Ucaphuka ngenxa yomyalezo ongacacanga malunga nempazamo yenkqubo evela kwinkqubo
  • Qala ngokutsha inkqubo nge umtya
  • Fumana umyalezo wemposiso kwiziphumo zomkhondo
  • Yiya phezulu ude ubetheke umnxeba wokuqala ongaphumelelanga

Kusenokwenzeka ukuba umnxeba wenkqubo kwinyathelo lesi-4 uya kutyhila ukuba yintoni ehambe kakubi.

Iingcebiso

Ngaphambi kokuba ndikubonise umzekelo wolungiso olunzima ngakumbi, ndiza kukubonisa amaqhinga ambalwa okusetyenziswa ngokufanelekileyo umtya:

indoda ngumhlobo wakho

Kwiinkqubo ezininzi ze-*nix, uluhlu olupheleleyo lwendlela yokufowuna kwi-kernel inokufunyanwa ngokubaleka indoda syscalls. Uya kubona izinto ezifana brk(2), okuthetha ukuba ulwazi oluninzi lunokufunyanwa ngokuqhuba indoda 2 brk.

Irakhi encinci: indoda 2 ifolokhwe undibonisa iphepha leqokobhe ifolokhwe () в GNU libc, oko, kuvela, iphunyezwe ngokubiza umfuziselo (). Biza i-semantics Ifom ihlala injalo ukuba ubhala inkqubo usebenzisa ifolokhwe (), kwaye ulandele umkhondo - andiyi kufumana nayiphi na iminxeba Ifom, endaweni yazo kuya kubakho umfuziselo (). Iireki ezinjalo ziyakubhida kuphela ukuba uqala ukuthelekisa umthombo kunye nemveliso umtya.

Sebenzisa -o ukugcina imveliso kwifayile

umtya inokuvelisa imveliso ebanzi, ngoko kuba luncedo rhoqo ukugcina iziphumo zomkhondo kwiifayile ezahlukeneyo (njengakumzekelo ongasentla). Oku kunceda ukuphepha ukubhidanisa imveliso yenkqubo kunye nemveliso umtya kwi console.

Sebenzisa -s ukujonga idatha yempikiswano engaphezulu

Usenokuba uqaphele ukuba isiqingatha sesibini somyalezo wemposiso asiboniswa kumzekelo wokulandelela ongentla. Kungenxa yokuba umtya Ukungagqibeki kubonisa kuphela iibyte zokuqala ezingama-32 zengxabano yomtya. Ukuba ufuna ukubona ngakumbi, yongeza into efana nayo -s 128 kwifowuni umtya.

-y yenza kube lula ukulandelela iifayile, iziseko, njl.

"All is file" ithetha ukuba *nix systems zenza yonke i-I/O isebenzisa iinkcazo zefayile, nokuba oko kusebenza kwifayile okanye kuthungelwano okanye kwi interprocess pipes. Oku kulungele udweliso lwenkqubo, kodwa kwenza kube nzima ukugcina umkhondo weyona nto iqhubekayo xa ubona okuqhelekileyo ukufunda и bhala kwisixokelelwano umnxeba iziphumo zokulandelela.

Ngokongeza umsebenzisi ewe, uya kunyanzela umtya Chaza inkcazo yefayile nganye kwimveliso ngenowuthi yento eyalatha kuyo.

Qhoboshela kwinkqubo esele iqhutywa nge -p**

Njengoko uza kubona kumzekelo ongezantsi, ngamanye amaxesha kufuneka ulandele inkqubo esele isebenza. Ukuba iyaziwa ukuba iyasebenza njengenkqubo 1337 (yithi, kwimveliso ps), emva koko ungayilanda ngolu hlobo:

$ strace -p 1337
...system call trace output...

Unokufuna amalungelo engcambu.

Sebenzisa -f ukujonga iinkqubo zomntwana

umtya Ngokungagqibekanga, ilanda inkqubo enye kuphela. Ukuba le nkqubo ivelisa iinkqubo zomntwana, ngoko inkqubo yokufowuna yokuzala inkqubo yomntwana inokubonwa, kodwa inkqubo yomntwana iifowuni zenkqubo aziyi kuboniswa.

Ukuba ucinga ukuba impazamo ikwinkqubo yomntwana, sebenzisa ingxelo -f, oku kuya kwenza umkhondo wayo. Icala elisezantsi koku kukuba imveliso iya kukubhida nangakumbi. Nini umtya ilandelela inkqubo enye okanye intambo enye, ibonisa uthotho lweziganeko zokufowuna. Xa ilandelela iinkqubo ezininzi ngaxeshanye, unokubona ukuqala kwefowuni ephazanyiswa ngumyalezo , emva koko-iqela leefowuni kwamanye amasebe okubulawa, kwaye emva koko-ukuphela kweyokuqala <…foocall yaqala>. Okanye ukwahlula zonke iziphumo zomkhondo kwiifayile ezahlukeneyo, usebenzisa nomsebenzisi -ff (iinkcukacha kwi ubunkokheli kwi umtya).

Uluhlu lokuhluza usebenzisa -e

Njengoko ubona, isiphumo somkhondo yimfumba yokwenyani yazo zonke iifowuni ezinokwenzeka zenkqubo. Iflegi -e Ungahluza umkhondo (bona ulawulo kwi umtya). Inzuzo ephambili kukuba kukhawuleza ukuqhuba umkhondo ohluziweyo kunokwenza umkhondo opheleleyo kwaye emva koko ukubamba`e. Ukunyaniseka, phantse ndihlala ndingakhathali.

Ayizizo zonke iimpazamo ezimbi

Umzekelo olula noqhelekileyo yinkqubo ekhangela ifayile kwiindawo ezininzi ngaxeshanye, njengeqokobhe elikhangela ulawulo oluqulathe ifayile ephunyezwayo:

$ strace sh -c uname
...
stat("/home/user/bin/uname", 0x7ffceb817820) = -1 ENOENT (No such file or directory)
stat("/usr/local/bin/uname", 0x7ffceb817820) = -1 ENOENT (No such file or directory)
stat("/usr/bin/uname", {st_mode=S_IFREG|0755, st_size=39584, ...}) = 0
...

I-Heuristics efana "nesicelo sokugqibela esingaphumelelanga ngaphambi kokuxela impazamo" ilungile ekufumaneni iimpazamo ezifanelekileyo. Nokuba kusenokuba njalo, kusengqiqweni ukuqala ukusuka ekugqibeleni.

Izifundo zokufundisa zeprogram zinokukunceda uqonde iifowuni zesistim.

Iifowuni eziqhelekileyo eziya kumathala eencwadi e-C ayizizo iifowuni zenkqubo, kodwa ngumaleko obhityileyo womphezulu kuphela. Ngoko ke, ukuba uyayiqonda incinci indlela kwaye wenze ntoni kwi-C, kuya kuba lula kuwe ukuba uqonde iziphumo zenkqubo yokufowuna komkhondo. Umzekelo, unengxaki yokulungisa iminxeba kwiinkqubo zenethiwekhi, jonga kwakudala okufanayo Isikhokelo seBija kwiNkqubo yeNethiwekhi.

Umzekelo onzima wokulungisa ingxaki

Sele nditshilo ukuba umzekelo wokulungisa iimpazamo ngumzekelo wento ekufuneka ndijongane nayo xa ndisebenza nayo umtya. Nangona kunjalo, ngamanye amaxesha uphando lokwenyani luyafuneka, ke nanku umzekelo wobomi bokwenyani wolungiso oluphambili.

bcron - umcwangcisi wokusetyenzwa komsebenzi, okunye ukuphunyezwa kwe *nix daemon Cron. Ifakwe kwiseva, kodwa xa umntu ezama ukuhlela ishedyuli, nantsi into eyenzekayo:

# crontab -e -u logs
bcrontab: Fatal: Could not create temporary file

Kulungile, oko kuthetha bcron wazama ukubhala ifayile ethile, kodwa ayizange isebenze, kwaye akayi kuvuma ukuba kutheni. Ukutyhila umtya:

# strace -o /tmp/trace crontab -e -u logs
bcrontab: Fatal: Could not create temporary file
# cat /tmp/trace
...
openat(AT_FDCWD, "bcrontab.14779.1573691864.847933", O_RDONLY) = 3
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f82049b4000
read(3, "#Ansible: logsaggn20 14 * * * lo"..., 8192) = 150
read(3, "", 8192)                       = 0
munmap(0x7f82049b4000, 8192)            = 0
close(3)                                = 0
socket(AF_UNIX, SOCK_STREAM, 0)         = 3
connect(3, {sa_family=AF_UNIX, sun_path="/var/run/bcron-spool"}, 110) = 0
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f82049b4000
write(3, "156:Slogs #Ansible: logsaggn20 1"..., 161) = 161
read(3, "32:ZCould not create temporary f"..., 8192) = 36
munmap(0x7f82049b4000, 8192)            = 0
close(3)                                = 0
write(2, "bcrontab: Fatal: Could not creat"..., 49) = 49
unlink("bcrontab.14779.1573691864.847933") = 0
exit_group(111)                         = ?
+++ exited with 111 +++

Kukho umyalezo wemposiso kufutshane nesiphelo bhala, kodwa ngoku kukho into eyahlukileyo. Okokuqala, akukho mpazamo yokufowuna kwenkqubo efanelekileyo, edla ngokwenzeka phambi koku. Okwesibini, kucacile ukuba kwindawo ethile umntu sele efunde umyalezo wephutha. Kubonakala ngathi eyona ngxaki ikwenye indawo, kwaye bcrontab ngokulula udlala emva umyalezo.

Ukuba ujonga indoda 2 ifunde, ungabona ukuba ingxabano yokuqala (3) yinkcazelo yefayile, ethi *nix isebenzisa yonke inkqubo ye-I/O. Ndiyifumana njani ukuba imele inkcazo yefayile 3? Kule meko, ungabaleka umtya kunye nomsebenzisi ewe (jonga ngasentla) kwaye iya kukuxelela ngokuzenzekelayo, kodwa ukufumana izinto ezinje, kuluncedo ukwazi ukufunda nokwahlulahlula iziphumo zomkhondo.

Umthombo wesichazi sefayile unokuba yenye yeefowuni ezininzi zenkqubo (konke kuxhomekeke kwinto inkcazo ye-console, isiseko sothungelwano, ifayile ngokwayo, okanye enye into), kodwa makube njalo, sijonge. iminxeba ngokubuyisela u-3 (okt. sijonge "= 3" kwiziphumo zokulandelela). Kwesi siphumo kukho ezi-2 zazo: openat phezulu kakhulu kwaye isiseko esiphakathini. openat ivula ifayile kodwa close(3) iya kwandula ke ibonise ukuba iyavala kwakhona. (I-Rake: izichazi zefayile zingaphinda zisetyenziswe xa zivuliwe kwaye zivaliwe). Fowuna isiseko () ifanelekile kuba yeyokugqibela ngaphambili funda (), kwaye kuvela ukuba i-bcrontab isebenza ngento ethile ngesokisi. Umgca olandelayo ubonisa ukuba inkcazo yefayile inxulunyaniswe nayo isiseko sommandla we-unix indlela enye /var/run/bron-spool.

Ke, kufuneka sifumane inkqubo ehambelana nayo isiseko se-unix kwelinye icala. Kukho amaqhinga ambalwa acocekileyo ale njongo, omabini aluncedo ekulungiseni ukusasazwa kweseva. Eyokuqala kukusebenzisa netstat okanye entsha ss (imo yesokhethi). Yomibini imiyalelo ibonisa uqhagamshelo lwenethiwekhi olusebenzayo lwenkqubo kwaye ithathe ingxelo -l ukuchaza iziseko zokuphulaphula, kunye nomsebenzisi -p ukubonisa iinkqubo eziqhagamshelwe kwisokethi njengomthengi. (Zininzi iinketho ezininzi eziluncedo, kodwa ezi zimbini zanele kulo msebenzi.)

# ss -pl | grep /var/run/bcron-spool
u_str LISTEN 0   128   /var/run/bcron-spool 1466637   * 0   users:(("unixserver",pid=20629,fd=3))

Oku kubonisa ukuba umphulaphuli ngumyalelo inixserver, esebenza nge-ID yenkqubo 20629. (Kwaye, ngokungqamanayo, isebenzisa inkcazo yefayile 3 njengesiseko.)

Isixhobo sesibini esiluncedo ngokwenene sokufumana ulwazi olufanayo lubizwa ngokuba lsof. Idwelisa zonke iifayile ezivuliweyo (okanye iinkcazo zefayile) kwisistim. Okanye ungafumana ulwazi malunga nefayile enye:

# lsof /var/run/bcron-spool
COMMAND   PID   USER  FD  TYPE  DEVICE              SIZE/OFF  NODE    NAME
unixserve 20629 cron  3u  unix  0x000000005ac4bd83  0t0       1466637 /var/run/bcron-spool type=STREAM

Inkqubo ye-20629 yiseva ehlala ixesha elide, ngoko ungayincamathisela kuyo umtya usebenzisa into enjalo umtya -o /tmp/trace -p 20629. Ukuba uhlela umsebenzi wecron kwenye i-terminal, uya kufumana isiphumo sokulandelela ngempazamo. Kwaye nantsi isiphumo:

accept(3, NULL, NULL)                   = 4
clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7faa47c44810) = 21181
close(4)                                = 0
accept(3, NULL, NULL)                   = ? ERESTARTSYS (To be restarted if SA_RESTART is set)
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=21181, si_uid=998, si_status=0, si_utime=0, si_stime=0} ---
wait4(0, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], WNOHANG|WSTOPPED, NULL) = 21181
wait4(0, 0x7ffe6bc36764, WNOHANG|WSTOPPED, NULL) = -1 ECHILD (No child processes)
rt_sigaction(SIGCHLD, {sa_handler=0x55d244bdb690, sa_mask=[CHLD], sa_flags=SA_RESTORER|SA_RESTART, sa_restorer=0x7faa47ab9840}, {sa_handler=0x55d244bdb690, sa_mask=[CHLD], sa_flags=SA_RESTORER|SA_RESTART, sa_restorer=0x7faa47ab9840}, 8) = 0
rt_sigreturn({mask=[]})                 = 43
accept(3, NULL, NULL)                   = 4
clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7faa47c44810) = 21200
close(4)                                = 0
accept(3, NULL, NULL)                   = ? ERESTARTSYS (To be restarted if SA_RESTART is set)
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=21200, si_uid=998, si_status=111, si_utime=0, si_stime=0} ---
wait4(0, [{WIFEXITED(s) && WEXITSTATUS(s) == 111}], WNOHANG|WSTOPPED, NULL) = 21200
wait4(0, 0x7ffe6bc36764, WNOHANG|WSTOPPED, NULL) = -1 ECHILD (No child processes)
rt_sigaction(SIGCHLD, {sa_handler=0x55d244bdb690, sa_mask=[CHLD], sa_flags=SA_RESTORER|SA_RESTART, sa_restorer=0x7faa47ab9840}, {sa_handler=0x55d244bdb690, sa_mask=[CHLD], sa_flags=SA_RESTORER|SA_RESTART, sa_restorer=0x7faa47ab9840}, 8) = 0
rt_sigreturn({mask=[]})                 = 43
accept(3, NULL, NULL

(Ekugqibeleni yamkela () ayiyi kugqitywa xa kulandelwa.) Kwakhona, ngelishwa, esi siphumo asiqulathanga impazamo esiyijongileyo. Asiyiboni nayiphi na imiyalezo ethunyelwa yi-bcrontag okanye eyifumana kwisokethi. Endaweni yoko, gqibezela ulawulo lwenkqubo (Clone, linda4, SIGCHLD njl.njl.) Le nkqubo ivelisa inkqubo yomntwana, ethi, njengoko unokuthekelela, yenza owona msebenzi. Kwaye ukuba ufuna ukubamba umkhondo wakhe, yongeza kumnxeba umtya -f. Yile nto esiya kuyifumana xa sikhangela umyalezo wemposiso kwisiphumo esitsha ngomtya -f -o /tmp/trace -p 20629:

21470 openat(AT_FDCWD, "tmp/spool.21470.1573692319.854640", O_RDWR|O_CREAT|O_EXCL, 0600) = -1 EACCES (Permission denied) 
21470 write(1, "32:ZCould not create temporary f"..., 36) = 36
21470 write(2, "bcron-spool[21470]: Fatal: logs:"..., 84) = 84
21470 unlink("tmp/spool.21470.1573692319.854640") = -1 ENOENT (No such file or directory)
21470 exit_group(111)                   = ?
21470 +++ exited with 111 +++

Ngoku, nantso into. Inkqubo 21470 ifumana impazamo "yokufikelela okwaliwe" xa uzama ukwenza ifayile endleleni tmp/spool.21470.1573692319.854640 (ngokunxulumene noluhlu olusebenzayo lwangoku). Ukuba besisazi nje ulawulo olusebenzayo lwangoku, besiya kuyazi indlela epheleleyo kwaye sikwazi ukubona ukuba kutheni inkqubo ingenakwenza ifayile yethutyana kuyo. Ngelishwa, inkqubo sele iphumile, ngoko awukwazi ukusebenzisa nje lsof -p 21470 ukuze ufumane ulawulo lwangoku, kodwa ungasebenza kwicala elichaseneyo - khangela i-PID 21470 inkqubo yeefowuni ezitshintsha ulawulo. (Ukuba akukho nanye, i-PID 21470 kufuneka ibe iyifumene kumzali wayo, kwaye oku sele kudlule. lsof -p ayifumaneki.) Le ndlela yokufowuna i chdir (ekulula ukuyifumana ngoncedo lweenjini zokukhangela zanamhlanje). Kwaye nantsi isiphumo sophendlo olubuyela umva olusekwe kwiziphumo zomkhondo, yonke indlela eya kwiseva ye-PID 20629:

20629 clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7faa47c44810) = 21470
...
21470 execve("/usr/sbin/bcron-spool", ["bcron-spool"], 0x55d2460807e0 /* 27 vars */) = 0
...
21470 chdir("/var/spool/cron")          = 0
...
21470 openat(AT_FDCWD, "tmp/spool.21470.1573692319.854640", O_RDWR|O_CREAT|O_EXCL, 0600) = -1 EACCES (Permission denied) 
21470 write(1, "32:ZCould not create temporary f"..., 36) = 36
21470 write(2, "bcron-spool[21470]: Fatal: logs:"..., 84) = 84
21470 unlink("tmp/spool.21470.1573692319.854640") = -1 ENOENT (No such file or directory)
21470 exit_group(111)                   = ?
21470 +++ exited with 111 +++

(Ukuba ulahlekile, unokufuna ukufunda iposti yam yangaphambili malunga *nix ulawulo lwenkqubo kunye namaqokobhe) Ngoko, umncedisi we-PID 20629 akazange afumane imvume yokwenza ifayile endleleni /var/spool/cron/tmp/spool.21470.1573692319.854640. Eyona nto inokwenzeka, isizathu soku lulungiselelo lwemvume yesixokelelwano sefayile. Masijonge:

# ls -ld /var/spool/cron/tmp/
drwxr-xr-x 2 root root 4096 Nov  6 05:33 /var/spool/cron/tmp/
# ps u -p 20629
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
cron     20629  0.0  0.0   2276   752 ?        Ss   Nov14   0:00 unixserver -U /var/run/bcron-spool -- bcron-spool

Kulapho inja ingcwatyelwa khona! Umncedisi uqhuba njenge cron yomsebenzisi, kodwa yingcambu kuphela enemvume yokubhala kulawulo /var/spool/cron/tmp/. Umyalelo olula i-cron ekhethiweyo /var/spool/cron/tmp/ iya kunyanzela bcron sebenza ngokuchanekileyo. (Ukuba bekungeyongxaki leyo, ke oyena mrhanelwa ulandelayo yimodyuli yokhuseleko yekernel efana neSELinux okanye iAppArmor, ke ndingajonga umyalezo we kernel dmesg.)

Iyonke

Umkhondo womnxeba weSistim unokuba mkhulu kumntu oqalayo, kodwa ndiyathemba ukuba ndibonisile ukuba bayindlela ekhawulezayo yokulungisa iklasi yonke yeengxaki eziqhelekileyo zokusasazwa. Yiba nomfanekiso uzama ukulungisa impazamo kwi-multiprocess bcronusebenzisa inyathelo ngenyathelo debugger.

Ukwahlulahlula iziphumo zomkhondo ngasemva ecaleni kwekhonkco leefowuni zenkqubo kufuna ubuchule, kodwa njengoko benditshilo, phantse rhoqo, usebenzisa umtya, Ndifumana nje isiphumo sokulandelela kwaye ndijonge iimpazamo ukusuka ekugqibeleni. Phofu, umtya indinceda ukuba ndonge ixesha elininzi lokulungisa ingxaki. Ndiyathemba ukuba iya kuba luncedo nakuwe.

umthombo: www.habr.com

Yongeza izimvo