Ukukhishwa kwesofthiwe yokulungisa iphutha nge-strace

Ukukhishwa kwesofthiwe yokulungisa iphutha nge-strace

Umsebenzi wami wosuku ikakhulukazi ukuthunyelwa kwesoftware, okusho ukuthi ngichitha isikhathi esiningi ngizama ukuphendula imibuzo efana nalena:

  • Le software isebenzela unjiniyela, kodwa hhayi kimi. Kungani?
  • Izolo le software ingisebenzele, kodwa namuhla ayisebenzi. Kungani?

Lolu wuhlobo lokulungisa iphutha oluhluke kancane ekulungiseni amaphutha kwesofthiwe okuvamile. Ukulungisa iphutha okuvamile kumayelana nokunengqondo kwekhodi, kodwa ukulungisa amaphutha okuthunyelwa kumayelana nokusebenzisana phakathi kwekhodi nendawo. Ngisho noma umsuka wenkinga uyiphutha elinengqondo, iqiniso lokuthi yonke into isebenza emshinini owodwa hhayi komunye kusho ukuthi inkinga ngandlela-thile isendaweni ezungezile.

Ngakho esikhundleni amathuluzi avamile ukulungisa iphutha like gdb Nginesethi ehlukile yamathuluzi okukhishwa kokususa iphutha. Futhi ithuluzi lami engilithandayo lokubhekana nenkinga efana nokuthi "Kungani le software ingasebenzi kimi?" ebizwa intambo.

Yini i-strace?

intambo iyithuluzi "lokulandelela ucingo lwesistimu". Yayidalelwe i-Linux ekuqaleni, kodwa amaqhinga afanayo okulungisa iphutha angenziwa ngamathuluzi wezinye izinhlelo (I-DTrace noma ktrace).

Isicelo esiyisisekelo silula kakhulu. Udinga nje ukusebenzisa i-strace nganoma yimuphi umyalo futhi izolahla zonke izingcingo zesistimu (yize kuqala kuzodingeka ukuthi uzifakele wena intambo):

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

Yiziphi lezi zingcingo zesistimu? Lokhu kuyinto efana ne-API ye-kernel yesistimu yokusebenza. Esikhathini eside, isofthiwe yayinokufinyelela okuqondile ku-hardware eyayisebenza kuyo. Uma, ngokwesibonelo, idinga ukubonisa okuthile esikrinini, idlale ngezimbobo noma amarejista afakwe kumephu enkumbulo wamadivayisi wevidiyo. Lapho izinhlelo zamakhompiyutha ezenza izinto eziningi zithandwa, kwabusa isiphithiphithi njengoba izicelo ezihlukahlukene zazilwa nge-hardware. Amaphutha kuhlelo lokusebenza olulodwa angehlisa amanye, uma kungenjalo isistimu yonke. Kwabe sekuvela izindlela zamalungelo (noma “ukuvikela indandatho”) ku-CPU. I-kernel yaba nelungelo elikhulu kunawo wonke: ithole ukufinyelela okugcwele ku-hardware, yaveza izinhlelo zokusebenza ezingenamalungelo amaningi osekumele zicele ukufinyelela ku-kernel ukuze zihlanganyele ne-hardware ngokusebenzisa izingcingo zesistimu.

Ezingeni kanambambili, ikholi yesistimu ihluke kancane ocingweni lokusebenza olulula, kodwa izinhlelo eziningi zisebenzisa isembozo kumtapo wolwazi ojwayelekile. Labo. umtapo wezincwadi ojwayelekile we-POSIX C uqukethe ucingo lomsebenzi bhala (), equkethe yonke ikhodi eqondene nesakhiwo socingo lwesistimu bhala.

Ukukhishwa kwesofthiwe yokulungisa iphutha nge-strace

Ngamafuphi, noma yikuphi ukusebenzisana phakathi kohlelo lokusebenza nendawo yalo (amasistimu ekhompyutha) kwenziwa ngezingcingo zesistimu. Ngakho-ke, uma isofthiwe isebenza emshinini owodwa kodwa hhayi komunye, kungaba kuhle ukubheka imiphumela yokulandela ucingo lwesistimu. Ngokuqondile, nalu uhlu lwamaphoyinti ajwayelekile angahlaziywa kusetshenziswa umkhondo wekholi yesistimu:

  • I-Console I/O
  • Inethiwekhi ye-I/O
  • Ukufinyelela ohlelweni lwefayela kanye nefayela I/O
  • Ukuphatha impilo yonke yochungechunge lwenqubo
  • Ukuphathwa kwememori kwezinga eliphansi
  • Ukufinyelela kuzishayeli zedivayisi ethile

Nini ukusebenzisa i-strace?

Ngombono, intambo esetshenziswa nanoma yiluphi uhlelo esikhaleni somsebenzisi, ngoba noma iluphi uhlelo esikhaleni somsebenzisi kufanele lushaye amakholi esistimu. Isebenza ngokuphumelelayo ngezinhlelo ezihlanganisiwe, ezisezingeni eliphansi, kodwa futhi isebenza ngezilimi ezisezingeni eliphezulu njengePython uma ungakwazi ukunqamula umsindo ongeziwe kusukela ngesikhathi sokusebenza kanye nomhumushi.

Enkazimulweni yayo yonke intambo izibonakalisa ngesikhathi sokulungisa iphutha lesofthiwe esebenza kahle emshinini owodwa, kodwa ngokuzumayo iyeke ukusebenza komunye, ikhiqize imilayezo engacacile mayelana namafayela, izimvume, noma imizamo engaphumelelanga yokwenza eminye imiyalo noma enye into... Kudabukisa, kodwa akukwenzi lokho. hlanganisa kahle nezinkinga ezisezingeni eliphezulu njengamaphutha okuqinisekisa isitifiketi. Ngokuvamile lokhu kudinga inhlanganisela intambo, kwesinye isikhathi i-ltrace namathuluzi ezinga eliphezulu (njengethuluzi lomugqa womyalo ukuvula ukulungisa iphutha).

Sizosebenzisa iseva ezimele njengesibonelo, kodwa ukulandelela ucingo lwesistimu ngokuvamile kungenziwa ezinkundleni zokuxhumana eziyinkimbinkimbi kakhulu. Udinga nje ukukhetha amathuluzi afanele.

Isibonelo esilula sokulungisa iphutha

Ake sithi ufuna ukusebenzisa uhlelo lokusebenza lweseva olumangalisayo i-foo, futhi nakhu okugcina ngakho:

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

Ngokusobala ayikwazanga ukuthola ifayela lokumisa olibhalile. Lokhu kwenzeka ngoba ngezinye izikhathi lapho abaphathi bephakheji behlanganisa uhlelo lokusebenza, babhala ngaphezulu izindawo zefayela ezilindelwe. Futhi uma ulandela umhlahlandlela wokufaka wokusatshalaliswa okukodwa, kokunye uthola amafayela ahluke ngokuphelele lapho obulindele khona. Inkinga ingaxazululwa emizuzwaneni embalwa uma umlayezo wephutha utshelwe ukuthi ulibheke kuphi ifayela lokucushwa, kodwa alikwenzi. Ngakho kuphi ukubheka?

Uma ukwazi ukufinyelela ikhodi yomthombo, ungayifunda futhi uthole yonke into. Uhlelo oluhle lokusekelayo, kodwa hhayi isixazululo esisheshayo. Ungaphendukela ku-debugger yesinyathelo ngesinyathelo njenge gdb futhi ubone ukuthi uhlelo lwenzani, kodwa kuphumelela kakhulu ukusebenzisa ithuluzi eliklanyelwe ukukhombisa ukusebenzisana nendawo ezungezile: intambo.

isiphetho intambo kungase kubonakale kungenasidingo, kodwa izindaba ezinhle ukuthi eziningi zazo zinganakwa ngokuphepha. Kuvame ukuba wusizo ukusebenzisa i-opharetha -o ukuze ulondoloze imiphumela yokulandela umkhondo efayeleni elihlukile:

$ 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 +++

Cishe lonke ikhasi lokuqala lokukhiphayo intambo - Lokhu kuvame ukulungiselela ukwethulwa kwezinga eliphansi. (Izingcingo eziningi mmap, mvikele, quill ngezinto ezifana nokuthola inkumbulo yezinga eliphansi nokubonisa amalabhulali ashukumisayo.) Empeleni, ngesikhathi sokususa iphutha okukhiphayo. intambo Kungcono ukufunda kusukela ekugcineni. Kuzoba nenselelo ngezansi bhala, ebonisa umlayezo wephutha. Sibheka ngenhla bese sibona ucingo lokuqala lwesistimu oluyiphutha - ucingo vula, okwenza iphutha ENOENT (“ifayela noma uhla lwemibhalo alutholakali”) ezama ukuvula /etc/foo/config.json. Yilapho ifayela lokumisa kufanele libe khona.

Lesi bekuyisibonelo nje, kodwa ngingasho u-90% wesikhathi engisisebenzisayo intambo, ayikho into enzima ukwedlula le. Ngezansi umhlahlandlela ophelele wokulungisa iphutha wesinyathelo nesinyathelo:

  • Uphatheke kabi ngenxa yomlayezo ongacacile mayelana nephutha lesistimu kusuka kuhlelo
  • Qala kabusha uhlelo nge intambo
  • Thola umlayezo wephutha emiphumeleni yokulandela umkhondo
  • Iya phezulu uze ushaye ikholi yesistimu yokuqala ehlulekile

Kungenzeka kakhulu ukuthi ikholi yesistimu esinyathelweni sesi-4 izoveza ukuthi yini engahambanga kahle.

Amacebiso

Ngaphambi kokukubonisa isibonelo sokulungisa iphutha okuyinkimbinkimbi, ngizokukhombisa amaqhinga ambalwa ukuze uwasebenzise ngempumelelo intambo:

indoda umngane wakho

Kuzinhlelo eziningi ze-*nix, uhlu oluphelele lwezingcingo zesistimu eziya ku-kernel lungatholwa ngokusebenza indoda syscalls. Uzobona izinto ezifana nalezi i-brk(2), okusho ukuthi ulwazi olwengeziwe lungatholwa ngokuqalisa indoda 2 brk.

Isikhwama esincane: indoda 2 imfoloko ungikhombisa ikhasi legobolondo imfoloko() в I-GNU libc, okuyinto, kuvela, isetshenziswa ngokubiza i-clone(). Shayela ama-semantics ifom ihlala ifana uma ubhala uhlelo usebenzisa imfoloko(), bese ulandela umkhondo - ngeke ngithole noma yimaphi amakholi ifom, esikhundleni sazo kuyoba khona i-clone(). Amaraki anjalo akudida kuphela uma uqala ukuqhathanisa umthombo nokuphumayo intambo.

Sebenzisa -o ukuze ulondoloze okukhiphayo efayeleni

intambo ingakhiqiza okukhiphayo okubanzi, ngakho-ke kuvame ukusebenziseka ukugcina imiphumela yokulandela umkhondo kumafayela ahlukene (njengakusibonelo esingenhla). Lokhu futhi kusiza ukugwema ukudida okuphumayo kohlelo nokuphumayo intambo kukhonsoli.

Sebenzisa -s ukuze ubuke idatha yempikiswano eyengeziwe

Kungenzeka ukuthi uqaphele ukuthi ingxenye yesibili yomlayezo wephutha ayiboniswa esibonelweni sokulandelela esingenhla. Kungoba intambo okuzenzakalelayo kubonisa kuphela amabhayithi okuqala angu-32 engxabano yeyunithi yezinhlamvu. Uma ufuna ukubona okwengeziwe, engeza okuthile okufana nalokhu - ikhasi 128 ocingweni intambo.

-y kwenza kube lula ukulandelela amafayela, amasokhethi, njll.

"Konke kuyifayela" kusho ukuthi *amasistimu angu-nix enza yonke i-I/O esebenzisa izichazi zefayela, kungakhathaliseki ukuthi lokho kusebenza kufayela noma inethiwekhi noma amapayipi okucubungula. Lokhu kulungele ukuhlela, kodwa kwenza kube nzima ukulandelela ukuthi kwenzakalani ngempela uma ubona okuvamile funda и bhala kumiphumela yokulandelela ikholi yesistimu.

Ngokungeza u-opharetha -y, uzophoqa intambo Chaza isichazi sefayela ngasinye kokuphumayo ngenothi lokuthi likhomba ini.

Namathisela kunqubo esebenzayo kakade ngokuthi -p**

Njengoba uzobona esibonelweni esingezansi, ngezinye izikhathi udinga ukulandelela uhlelo oseluvele lusebenza. Uma kwaziwa ukuthi isebenza njengenqubo 1337 (ithi, kusukela kokuphumayo ps), khona-ke ungayilandelela kanje:

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

Ungase udinge amalungelo ezimpande.

Sebenzisa -f ukuqapha izinqubo zengane

intambo Ngokuzenzakalelayo, ilandelela inqubo eyodwa kuphela. Uma le nqubo idala izinqubo zengane, khona-ke ikholi yesistimu yokuzala inqubo yengane ingabonakala, kodwa amakholi wesistimu yengane ngeke aboniswe.

Uma ucabanga ukuthi iphutha likunqubo yengane, sebenzisa isitatimende -f, lokhu kuzonika amandla ukulandelelwa kwayo. Okubi kulokhu ukuthi okukhiphayo kuzokudida nakakhulu. Nini intambo ilandelela inqubo eyodwa noma umucu owodwa, ikhombisa ukusakazwa kwemicimbi yekholi. Uma ilandelela izinqubo eziningi ngesikhathi esisodwa, ungase ubone ukuqala kwekholi ephazanyiswa umlayezo , ke - inqwaba yezingcingo kwamanye amagatsha okubulawa, futhi kuphela - ukuphela kweyokuqala . Noma hlukanisa yonke imiphumela yokulandela umkhondo ibe amafayela ahlukene, usebenzisa no-opharetha -ff (imininingwane ku ubuholi on intambo).

Hlunga imikhondo usebenzisa -e

Njengoba ubona, umphumela womkhondo uyinqwaba yangempela yazo zonke izingcingo zesistimu ezingase zibe khona. Hlaba umkhosi -e Ungakwazi ukuhlunga umkhondo (bona umhlahlandlela on intambo). Inzuzo enkulu ukuthi kuyashesha ukusebenzisa umkhondo ohlungiwe kunokwenza umkhondo ogcwele bese i-grep`ngo. Uma ngikhuluma iqiniso, cishe anginandaba njalo.

Akuwona wonke amaphutha amabi

Isibonelo esilula nesivamile wuhlelo olufuna ifayela ezindaweni ezimbalwa ngesikhathi esisodwa, njengegobolondo elifuna uhla lwemibhalo oluqukethe ifayela elisebenzisekayo:

$ 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 sokugcina esihlulekile ngaphambi kokubika iphutha" ilungile ekutholeni amaphutha afanelekile. Noma ngabe kunjalo, kunengqondo ukuqala kusukela ekugcineni.

Izifundo zokuhlela ze-C zingakusiza uqonde amakholi wesistimu.

Izingcingo ezijwayelekile eziya emitapweni yolwazi ye-C azizona izingcingo zesistimu, kodwa ziwungqimba olungaphezulu oluncane kuphela. Ngakho-ke, uma uqonda okungenani kancane ukuthi kanjani nokuthi yini okufanele uyenze ku-C, kuzoba lula kuwe ukuqonda imiphumela yokulandelela ucingo lwesistimu. Isibonelo, unenkinga yokususa amaphutha amakholi kumasistimu enethiwekhi, bheka okwakudala okufanayo I-Bija's Guide to Network Programming.

Isibonelo sokususa iphutha esiyinkimbinkimbi

Sengike ngasho ukuthi isibonelo sokususa iphutha okulula siyisibonelo salokho okufanele ngibhekane nakho lapho ngisebenza intambo. Nokho, ngezinye izikhathi uphenyo lwangempela luyadingeka, ngakho-ke nasi isibonelo sempilo yangempela sokususa iphutha okuthuthuke kakhulu.

bcron - Isihleli sokucubungula umsebenzi, okunye ukuqaliswa kwe-daemon *nix cron. Ifakwe kuseva, kodwa uma othile ezama ukuhlela ishejuli, nakhu okwenzekayo:

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

Kulungile, lokho kusho bcron wazama ukubhala ifayela elithile, kodwa akuphumelelanga, futhi ngeke avume ukuthi kungani. Ukwembula intambo:

# 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 +++

Kunomlayezo wephutha eduze kwasekugcineni bhala, kodwa kulokhu kukhona okuhlukile. Okokuqala, alikho iphutha lekholi yesistimu efanele, elivame ukwenzeka ngaphambi kwalokhu. Okwesibili, kusobala ukuthi endaweni ethile othile usevele wafunda umlayezo wephutha. Kubukeka sengathi inkinga yangempela ikwenye indawo, futhi i-bcrontab umane udlala emuva umyalezo.

Uma ubheka indoda 2 funda, ungabona ukuthi i-agumenti yokuqala (3) iyisichazi sefayela, *nix esisebenzisa kukho konke ukucubungula kwe-I/O. Ngithola kanjani ukuthi isichazi sefayela 3 simelela? Kulesi simo, ungagijima intambo no-opharetha -y (bona ngenhla) futhi izokutshela ngokuzenzakalelayo, kodwa ukuthola izinto ezinjengalezi, kuyasiza ukwazi ukufunda nokuhlaziya imiphumela yokulandelela.

Umthombo wesichazi sefayela ungaba olunye lwezingcingo eziningi zesistimu (konke kuncike ekutheni isichazi siyini - ikhonsoli, isokhethi yenethiwekhi, ifayela ngokwalo, noma enye into), kodwa noma kungaba njalo, sibheka izingcingo ngokubuyisela u-3 (okungukuthi sibheka "= 3" emiphumeleni yokulandela umkhondo). Kulo mphumela kukhona ezi-2 zazo: vula phezulu kakhulu futhi isokhethi Phakathi. vula evula ifayela kodwa vala(3) izobe isikhombisa ukuthi iyavala futhi. (I-Rake: izichazi zefayela zingasetshenziswa kabusha uma zivulwa futhi zivalekile). Shaya ucingo isokhethi() kufanelekile ngoba ngeyokugcina ngaphambili funda (), futhi kuvele ukuthi i-bcrontab isebenza ngokuthile ngesokhethi. Umugqa olandelayo ubonisa ukuthi isichazi sefayela sihlotshaniswa nayo isokhethi lesizinda se-unix ngisendleleni /var/run/bcron-spool.

Ngakho-ke, sidinga ukuthola inqubo ehambisana nayo unix isokhethi ngakolunye uhlangothi. Kunamaqhinga ambalwa ahlanzekile ale njongo, womabili awusizo ekulungiseni amaphutha okuthunyelwa kweseva. Okokuqala ukusebenzisa netstat noma okusha ss (isimo sesokhethi). Yomibili imiyalo ibonisa ukuxhumana kwenethiwekhi okusebenzayo futhi ithatha isitatimende -l ukuchaza amasokhethi okulalela, kanye nomsebenzisi -p ukuze ubonise izinhlelo ezixhunywe kusokhethi njengeklayenti. (Kunezinketho eziningi eziwusizo, kodwa lezi ezimbili 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))

Lokhu kusikisela ukuthi umlaleli ungumyalo inixserver, esebenza ne-ID yenqubo engu-20629. (Futhi, ngokuzenzakalelayo, isebenzisa isichazi sefayela 3 njengesokhethi.)

Ithuluzi lesibili eliwusizo ngempela lokuthola ulwazi olufanayo libizwa ngokuthi lsof. Ibala wonke amafayela avuliwe (noma izichazi zefayela) ohlelweni. Noma ungathola ulwazi mayelana nefayela elilodwa:

# 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

I-Process 20629 iyiseva ephile isikhathi eside, ngakho ungakwazi ukuyinamathisela kuyo intambo usebenzisa into enjalo strace -o /tmp/trace -p 20629. Uma uhlela umsebenzi we-cron kwenye itheminali, uzothola okukhiphayo okunephutha. Futhi nawu umphumela:

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

(Okokugcina vuma() ngeke kuqedwe uma kulandelwa umkhondo.) Futhi, ngeshwa, lo mphumela awunalo iphutha esilifunayo. Asiyiboni imilayezo i-bcrontag eyithumela noma eyitholayo ukusuka kusokhethi. Kunalokho, qedela ukulawulwa kwenqubo (i-clone, linda4, SIGCHLD njll.) Le nqubo idala inqubo yengane, okuthi, njengoba ungase uyiqagele, eyenza umsebenzi wangempela. Futhi uma udinga ukubamba umkhondo wakhe, engeza ocingweni uhlaka -f. Yilokhu esizokuthola lapho sisesha umlayezo wephutha kumphumela omusha one-strace -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 +++

Manje, lokho kuyinto ethize. I-Process 21470 ithola iphutha "lokunqatshelwe ukufinyelela" lapho izama ukudala ifayela endleleni tmp/spool.21470.1573692319.854640 (okuhlobene nohlu lwamanje lokusebenza). Ukube besazi uhla lwemibhalo olusebenzayo lwamanje, besizokwazi nendlela ephelele futhi sikwazi ukuthola ukuthi kungani inqubo ingakwazi ukudala ifayela layo lesikhashana kuyo. Ngeshwa, inqubo isivele iphumile, ngakho awukwazi ukusebenzisa I-lsof -p 21470 ukuze uthole uhla lwemibhalo lwamanje, kodwa ungasebenzela ngakolunye uhlangothi - bheka izingcingo zesistimu ye-PID 21470 ezishintsha inkomba. (Uma zingekho, i-PID 21470 kumele izizuze njengefa kumzali wayo, futhi lokhu sekudlulile lsf -p ayitholakali.) Lolu cingo lwesistimu chdir (okulula ukukuthola ngosizo lwezinjini zokusesha zesimanjemanje). Futhi nawu umphumela wokusesha okuhlanekezelwe ngokusekelwe emiphumeleni yokulandela umkhondo, yonke indlela eya kuseva 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 +++

(Uma ulahlekile, ungahle ufune ukufunda okuthunyelwe kwami ​​​​kwangaphambilini mayelana *nokuphathwa kwenqubo ye-nix namagobolondoNgakho, iseva ye-PID 20629 ayizange ithole imvume yokudala ifayela endleleni /var/spool/cron/tmp/spool.21470.1573692319.854640. Ngokunokwenzeka, isizathu salokhu izilungiselelo zemvume yesistimu yefayela yakudala. Ake sihlole:

# 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 kungcwatshwe khona inja! Iseva isebenza njenge-cron yomsebenzisi, kodwa impande kuphela enemvume yokubhalela uhla lwemibhalo /var/spool/cron/tmp/. Umyalo olula chown cron /var/spool/cron/tmp/ izophoqa bcron sebenza ngendlela efanele. (Uma leyo bekungeyona inkinga, khona-ke umsolwa olandelayo okungenzeka ukuthi uyimojula yokuphepha ye-kernel efana ne-SELinux noma i-AppArmor, ngakho-ke bengizohlola ilogi yomlayezo we-kernel nayo. dmesg.)

Inani

Ukulandelelwa kwezingcingo zesistimu kungaba nzima kakhulu koqalayo, kodwa ngithemba ukuthi ngibonise ukuthi ayindlela esheshayo yokususa iphutha kukilasi lonke lezinkinga ezivamile zokuphakelwa. Cabanga uzama ukulungisa iphutha le-multiprocess bcronusebenzisa i-debugger yesinyathelo ngesinyathelo.

Ukuhlaziya imiphumela yokulandela emuva emuva kuchungechunge lwezingcingo zesistimu kudinga ikhono, kodwa njengoba ngishilo, cishe njalo, ukusebenzisa intambo, ngivele ngithole umphumela wokulandela bese ngibheka amaphutha kusukela ekugcineni. Noma kunjalo, intambo ingisiza ukuthi ngonge isikhathi esiningi ekususeni iphutha. Ngethemba ukuthi kuzoba usizo nakuwe.

Source: www.habr.com

Engeza amazwana