Imscaradh bogearraí dífhabhtaithe le strace

Imscaradh bogearraí dífhabhtaithe le strace

Imscaradh bogearraí is mó atá i mo phost lae, rud a chiallaíonn go gcaitheann mé go leor ama ag iarraidh ceisteanna a fhreagairt mar:

  • Oibríonn an bogearraí seo don fhorbróir, ach ní domsa. Cén fáth?
  • Inné d'oibrigh na bogearraí seo dom, ach inniu níl. Cén fáth?

Is cineál dífhabhtaithe é seo atá beagán difriúil ó dhífhabhtaithe bogearraí rialta. Baineann dífhabhtú rialta le loighic an chóid, ach baineann dífhabhtú imlonnaithe leis an idirghníomhú idir an cód agus an comhshaol. Fiú más earráid loighciúil é fréamh na faidhbe, ciallaíonn an fhíric go n-oibríonn gach rud ar mheaisín amháin agus ní ar mheaisín eile go bhfuil an fhadhb ar bhealach éigin sa timpeallacht.

Mar sin, in ionad na n-uirlisí debugging is gnách ar nós gdb Tá sraith uirlisí éagsúla agam le haghaidh imscaradh dífhabhtaithe. Agus an uirlis is fearr liom chun déileáil leis an bhfadhb mar "Cén fáth nach n-oibríonn na bogearraí seo domsa?" ar a dtugtar stríoc.

Cad é strace?

stríoc Is uirlis é le haghaidh “rianú glaonna córais”. Cruthaíodh é ar dtús le haghaidh Linux, ach is féidir na cleasanna dífhabhtaithe céanna a dhéanamh le huirlisí do chórais eile (DTracektration).

Tá an t-iarratas bunúsach an-simplí. Ní gá duit ach rith go géar le haon ordú agus dumpálfaidh sé gach glao córais (cé is dócha go mbeidh ort éa shuiteáil ar dtús stríoc):

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

Cad iad na glaonna córais seo? Is é seo rud éigin cosúil le API le haghaidh eithne an chórais oibriúcháin. Uair amháin, bhí rochtain dhíreach ag bogearraí ar na crua-earraí a bhí ar siúl acu. Más rud é, mar shampla, go raibh gá leis rud éigin a thaispeáint ar an scáileán, d'imir sé le calafoirt nó le cláir chuimhne-mhapáilte le haghaidh gléasanna físe. Nuair a tháinig an-tóir ar chórais ríomhaireachta iltascála, tháinig anord chun cinn agus feidhmchláir éagsúla ag troid ar na crua-earraí. D'fhéadfadh earráidí in aon fheidhmchlár amháin cinn eile a laghdú, murab é an córas iomlán iad. Ansin bhí modhanna pribhléide (nó “cosaint fáinne”) le feiceáil sa LAP. Tháinig an t-eithne is pribhléid: fuair sé rochtain iomlán ar na crua-earraí, ag sceitheadh ​​feidhmchláir nach raibh chomh pribhléideach sin a raibh orthu rochtain a iarraidh ón eithne cheana féin chun idirghníomhú leis na crua-earraí trí ghlaonna córais.

Ag an leibhéal dénártha, tá glao córais beagán difriúil ó ghlao feidhm shimplí, ach úsáideann formhór na gclár fillteán sa leabharlann chaighdeánach. Iad siúd. tá glao feidhme i leabharlann chaighdeánach POSIX C scríobh (), ina bhfuil an cód ailtireachta ar fad don ghlao córais scríobh.

Imscaradh bogearraí dífhabhtaithe le strace

I mbeagán focal, déantar aon idirghníomhaíocht idir feidhmchlár agus a thimpeallacht (córais ríomhaireachta) trí ghlaonna córais. Mar sin, nuair a oibríonn bogearraí ar mheaisín amháin ach ní ar mheaisín eile, bheadh ​​sé go maith breathnú ar thorthaí rianaithe glaonna an chórais. Go sonrach, seo liosta de ghnáthmhóimintí ar féidir anailís a dhéanamh orthu ag baint úsáide as rian glaonna córais:

  • Consól I/O
  • Líonra I/O
  • Rochtain ar an gcóras comhaid agus I/O comhad
  • Saolré snáithe próisis a bhainistiú
  • Bainistíocht cuimhne ar leibhéal íseal
  • Rochtain ar tiománaithe gléasanna ar leith

Cathain is ceart strace a úsáid?

Go teoiriciúil, stríoc a úsáidtear le haon ríomhchlár sa spás úsáideora, toisc go gcaithfidh aon chlár sa spás úsáideora glaonna córais a dhéanamh. Oibríonn sé níos éifeachtaí le cláir tiomsaithe, íseal-leibhéil, ach oibríonn sé freisin le teangacha ardleibhéil cosúil le Python más féidir leat an torann breise a ghearradh ón am rite agus an ateangaire.

Ina splendour go léir stríoc le feiceáil le linn dífhabhtaithe bogearraí a oibríonn go maith ar mheaisín amháin, ach go tobann stopann sé ag obair ar mheaisín eile, ag cruthú teachtaireachtaí doiléir faoi chomhaid, ceadanna, nó iarrachtaí nár éirigh leo roinnt orduithe nó rud éigin eile a fhorghníomhú... Is mór an trua, ach ní dhéanann sé a chomhcheangal chomh maith sin le fadhbanna ardleibhéil amhail earráidí fíoraithe teastais. De ghnáth, éilíonn sé seo meascán stríocuaireanta ltrace agus uirlisí ardleibhéil (cosúil leis an uirlis líne ordaithe OpenSSL chun an deimhniú a dhífhabhtú).

Bainfimid úsáid as freastalaí aonair mar shampla, ach is minic is féidir rianú glaonna córais a dhéanamh ar ardáin imlonnaithe níos casta. Ní mór duit ach na huirlisí cearta a roghnú.

Sampla debugging simplí

Ligean le rá gur mhaith leat an feidhmchlár freastalaí iontach a rith, agus seo é a bheidh agat sa deireadh:

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

De réir dealraimh, níorbh fhéidir leis an comhad cumraíochta a scríobh tú a aimsiú. Tarlaíonn sé seo mar uaireanta nuair a thiomsaíonn bainisteoirí pacáiste feidhmchlár, sáraíonn siad na láithreacha comhaid a bhfuiltear ag súil leo. Agus má leanann tú an treoir suiteála le haghaidh dáileadh amháin, i gceann eile gheobhaidh tú comhaid go hiomlán difriúil ón áit a raibh súil agat. D’fhéadfaí an fhadhb a réiteach i gceann cúpla soicind dá n-inseofaí sa teachtaireacht earráide cá háit ar cheart an comhad cumraíochta a chuardach, ach ní amhlaidh. Mar sin, nuair a chuardach?

Má tá rochtain agat ar an gcód foinse, is féidir leat é a léamh agus gach rud a fháil amach. Plean cúltaca maith, ach ní hé an réiteach is tapúla. Is féidir leat dul i muinín dífhabhtóir céim ar chéim cosúil le gdb agus féach cad a dhéanann an clár, ach tá sé i bhfad níos éifeachtaí uirlis a úsáid atá deartha go sonrach chun idirghníomhú leis an gcomhshaol a thaispeáint: stríoc.

Aschur stríoc Is féidir go bhfuil cuma iomarcach air, ach is é an dea-scéal ná gur féidir neamhaird a dhéanamh den chuid is mó de go sábháilte. Is minic a bhíonn sé úsáideach an t-oibreoir -o a úsáid chun rian na dtorthaí a shábháil i gcomhad ar leith:

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

Timpeall an chéad leathanach iomlán den aschur stríoc - De ghnáth is ullmhúchán ísealleibhéil é seo don seoladh. (Go leor glaonna mmap, mprotect, cuaille le haghaidh rudaí cosúil le cuimhne íseal-leibhéal a bhrath agus leabharlanna dinimiciúla a thaispeáint.) I ndáiríre, le linn an t-aschur a dhífhabhtú stríoc Is fearr léamh ón deireadh. Beidh dúshlán thíos scríobh, a thaispeánann teachtaireacht earráide. Breathnaímid thuas agus feicimid an chéad ghlao córais earráideach - an glaoch oscailtat, a throws earráid ENOENT (“comhad nó eolaire gan aimsiú”) ag iarraidh a oscailt /etc/foo/config.json. Seo an áit ar cheart don chomhad cumraíochta a bheith.

Ní raibh anseo ach sampla, ach déarfainn 90% den am a úsáidim stríoc, níl aon rud i bhfad níos deacra a dhéanamh ná seo. Anseo thíos tá treoir dífhabhtaithe céim ar chéim iomlán:

  • Bí trína chéile mar gheall ar theachtaireacht doiléir faoi earráid system-y ó ríomhchlár
  • Atosaigh an clár le stríoc
  • Faigh an teachtaireacht earráide sna torthaí rian
  • Téigh níos airde go dtí go mbuaileann tú an chéad ghlao córais ar theip air

Is beag seans go léireoidh glao an chórais i gcéim 4 cad a tharla.

Leideanna

Sula dtaispeánfaidh tú sampla de dhífhabhtú níos casta duit, taispeánfaidh mé cúpla cleas duit le húsáid éifeachtach stríoc:

Is é an fear do chara

Ar go leor córais *nix, is féidir liosta iomlán de ghlaonna córais chuig an eithne a fháil ach iad a rith fear syscalls. Feicfidh tú rudaí cosúil le brk(2), rud a chiallaíonn gur féidir tuilleadh eolais a fháil trí reáchtáil fear 2 brk.

Raca beag: fear 2 forc taispeánann sé dom an leathanach don bhlaosc forc () в GNU libc, a bhfuil, casadh sé amach, i bhfeidhm trí ghlaoch clón (). Séimeantaic glaoch forc fós mar an gcéanna má scríobhann tú ag baint úsáide as clár forc (), agus rith rian - ní bhfaighidh mé aon ghlaonna forc, in ionad iad a bheidh clón (). Ní chuireann rácaí den sórt sin mearbhall ort ach amháin má thosaíonn tú ag cur an fhoinse i gcomparáid leis an aschur stríoc.

Úsáid -o chun an t-aschur a shábháil i gcomhad

stríoc is féidir aschur fairsing a ghiniúint, mar sin is minic a bhíonn sé úsáideach rian torthaí a stóráil i gcomhaid ar leith (mar atá sa sampla thuas). Cuidíonn sé seo freisin le mearbhall a sheachaint idir aschur clár agus aschur stríoc sa chonsól.

Úsáid -s chun tuilleadh sonraí argóinte a fheiceáil

Seans gur thug tú faoi deara nach bhfuil an dara leath den teachtaireacht earráide léirithe sa rian sampla thuas. Tá sé mar gheall ar stríoc ní léiríonn an réamhshocrú ach an chéad 32 beart den argóint teaghrán. Más mian leat níos mó a fheiceáil, cuir rud éigin cosúil leis -í 128 chuig an nglao stríoc.

-y déanann sé níos éasca comhaid, soicéid, etc.

Ciallaíonn "All is file" go ndéanann *nix córais gach I/O ag baint úsáide as tuairisceoirí comhaid, cibé an mbaineann sé sin le comhad nó líonra nó píopaí idirphróisis. Tá sé seo áisiúil do ríomhchlárú, ach déanann sé deacair súil a choinneáil ar cad atá ar siúl i ndáiríre nuair a fheiceann tú coitianta léamh и scríobh i dtorthaí rian glaonna an chórais.

Trí oibreoir a chur leis yeah, beidh tú bhfeidhm stríoc anótáil gach tuairisceoir comhaid san aschur le nóta den rud a díríonn sé air.

Ceangail le próiseas atá ar siúl cheana féin le -p**

Mar a fheicfidh tú ón sampla thíos, uaireanta is gá duit clár atá ar siúl cheana féin a rianú. Má tá a fhios go bhfuil sé ag rith mar phróiseas 1337 (abair, ón aschur ps), ansin is féidir leat é a rianú mar seo:

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

Seans go mbeidh cearta fréimhe uait.

Úsáid -f chun monatóireacht a dhéanamh ar phróisis leanaí

stríoc De réir réamhshocraithe, ní rianaíonn sé ach próiseas amháin. Má scarann ​​an próiseas seo próisis linbh, ansin is féidir an glao ar an gcóras chun an próiseas leanbh a sceitheadh ​​a fheiceáil, ach ní thaispeánfar glaonna córas an linbh.

Má cheapann tú go bhfuil an earráid i bpróiseas linbh, bain úsáid as an ráiteas -f, cuirfidh sé seo ar chumas a rianú. Is é an míbhuntáiste a bhaineann leis seo ná go gcuirfidh an t-aschur níos mó mearbhall ort. Cathain stríoc rianaíonn sé próiseas amháin nó snáithe amháin, taispeánann sé sruth amháin imeachtaí glaonna. Nuair a rianaíonn sé próisis iolracha ag an am céanna, seans go bhfeicfidh tú tús an ghlao a gcuirtear isteach air ag teachtaireacht , ansin - roinnt glaonna ar bhrainsí forghníomhaithe eile, agus gan ach ansin - deireadh an chéad cheann <…foocall atosú>. Nó scoilt na torthaí rian go léir i gcomhaid éagsúla, ag baint úsáide as an oibreoir freisin -ff (sonraí i treoir ar stríoc).

Scag rianta ag baint úsáide as -e

Mar a fheiceann tú, is é an toradh an rian carn fíor de gach córas féideartha glaonna. Bratach -e Is féidir leat an rian a scagadh (féach treoir ar stríoc). Is é an buntáiste is mó ná go bhfuil sé níos tapúla rian scagtha a reáchtáil ná rian iomlán a dhéanamh agus ansin grep`ag. Le bheith macánta, is cuma liom i gcónaí.

Níl gach botún dona

Sampla simplí agus coitianta is ea clár a lorgaíonn comhad i roinnt áiteanna ag an am céanna, cosúil le blaosc a lorgaíonn eolaire ina bhfuil comhad inrite:

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

Tá heuristic amhail “an t-iarratas deireanach ar theip air sula dtuairiscítear earráid” go maith chun earráidí ábhartha a aimsiú. Bíodh sin mar atá, tá sé loighciúil tosú ón deireadh.

Is féidir le ranganna teagaisc ríomhchláraithe cabhrú leat glaonna córais a thuiscint.

Ní glaonna córais iad glaonna caighdeánacha chuig leabharlanna C, ach sraith tanaí dromchla. Mar sin, má thuigeann tú ar a laghad beagán conas agus cad atá le déanamh i C, beidh sé níos éasca duit torthaí rian glaonna an chórais a thuiscint. Mar shampla, tá deacracht agat glaonna dífhabhtaithe chuig córais líonra, féach ar an clasaiceach céanna Treoir Bija maidir le Clárú Líonra.

Sampla debugging níos casta

Dúirt mé cheana féin gur sampla é an sampla dífhabhtaithe simplí den chuid is mó a gcaithfidh mé déileáil leis agus mé ag obair leis stríoc. Uaireanta, áfach, bíonn gá le fíor-imscrúdú, mar sin seo sampla fíor-saoil de dhífhabhtú níos forbartha.

bcron - sceidealóir próiseála tascanna, cur chun feidhme eile den *nix deamhan cron. Tá sé suiteáilte ar an bhfreastalaí, ach nuair a dhéanann duine iarracht an sceideal a chur in eagar, seo mar a tharlaíonn:

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

Ceart go leor, ciallaíonn sé sin bcron rinne sé iarracht comhad áirithe a scríobh, ach níor oibrigh sé amach, agus ní admhóidh sé cén fáth. Ag nochtadh stríoc:

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

Tá teachtaireacht earráide gar don deireadh scríobh, ach an uair seo tá rud éigin difriúil. Ar an gcéad dul síos, níl aon earráid ghlao córais ábhartha, a tharlaíonn de ghnáth roimhe seo. Ar an dara dul síos, tá sé soiléir go bhfuil an teachtaireacht earráide léite ag duine éigin cheana féin. Breathnaíonn sé cosúil go bhfuil an fhadhb fíor áit éigin eile, agus bcrontab imríonn go simplí ar ais ar an teachtaireacht.

Má fhéachann tú ar fear 2 léite, is féidir leat a fheiceáil gurb é an chéad argóint (3) ná tuairisceoir comhaid, a úsáideann *nix do gach próiseáil I/O. Conas a gheobhaidh mé amach cad a sheasann tuairisceoir comhaid 3? Sa chás áirithe seo, is féidir leat a reáchtáil stríoc le hoibreoir yeah (féach thuas) agus beidh sé insint duit go huathoibríoch, ach a dhéanamh amach rudaí mar seo, tá sé úsáideach go mbeadh a fhios conas a léamh agus a pharsáil torthaí rian.

Is féidir le foinse tuairisceora comhaid a bheith ar cheann de go leor glaonna córais (braitheann sé ar fad ar cad chuige an tuairisceoir - consól, soicéad líonra, an comhad féin, nó rud éigin eile), ach bíodh sin mar a d'fhéadfadh sé, táimid ag lorg glaonna trí 3 a sheoladh ar ais (i.e. féachaimid le haghaidh “= 3” sna torthaí rianaithe). Sa toradh seo tá 2 cheann acu: oscailtat ag barr an-agus soicéad I lár. oscailtat osclaíonn sé an comhad ach gar(3) taispeánfaidh sé ansin go ndúnann sé arís. (Rake: is féidir tuairisceoirí comhaid a athúsáid nuair a osclaítear agus nuair a dhúntar iad). Glaoigh soicéad () oiriúnach mar tá sé an ceann deireanach roimh léigh (), agus tarlaíonn sé go n-oibríonn bcrontab le rud éigin trí soicéad. Léiríonn an chéad líne eile go bhfuil baint ag an tuairisceoir comhaid le soicéad fearainn unix ar an mbealach /var/run/bcron-spool.

Mar sin, ní mór dúinn teacht ar an bpróiseas a bhaineann le soicéad unix ar an taobh eile. Tá cúpla cleas néata ann chun na críche seo, agus tá an dá cheann acu úsáideach le haghaidh imscaradh freastalaí a dhífhabhtú. Is é an chéad cheann a úsáid netstat nó níos nuaí ss (stádas soicéad). Léiríonn an dá ordú naisc líonra gníomhacha an chórais agus glacann siad an ráiteas -l chun cur síos a dhéanamh ar soicéid éisteachta, chomh maith leis an oibreoir -p chun cláir atá nasctha leis an soicéad a thaispeáint mar chliant. (Tá go leor roghanna níos úsáidí ann, ach is leor an dá cheann seo don tasc seo.)

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

Tugann sé seo le tuiscint gurb é an t-éisteoir an t-ordú freastalaí inix, ag rith le haitheantas próisis 20629. (Agus, i gcomhthráth, úsáideann sé tuairisceoir comhaid 3 mar an soicéad.)

Tugtar an dara uirlis úsáideach chun an fhaisnéis chéanna a aimsiú lsof. Liostaíonn sé gach comhad oscailte (nó tuairisceoirí comhaid) ar an gcóras. Nó is féidir leat eolas a fháil faoi chomhad sonrach amháin:

# 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

Is freastalaí fadsaoil é Próiseas 20629, ionas gur féidir leat é a cheangal leis stríoc ag baint úsáide as rud éigin cosúil le strace -o /tmp/trace -p 20629. Má chuireann tú post cron in eagar i gcríochfort eile, gheobhaidh tú rian-aschur a bhfuil earráid ann. Agus seo é an toradh:

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

(Deir glacadh () ní chríochnófar é agus é á lorg.) Arís, ar an drochuair, níl an earráid atá á lorg againn sa toradh seo. Ní fheicimid aon teachtaireachtaí a sheolann nó a fhaigheann bcrontag ón soicéad. Ina ionad sin, rialú próisis iomlán (Clón, fan4, SIGCHLD srl.) Fágann an próiseas seo próiseas linbh, a dhéanann, mar a d’fhéadfá buille faoi thuairim, an fíorobair. Agus más gá duit a ghabháil léi rian, a chur leis an glaoch stríoc -f. Is é seo a gheobhaidh muid nuair a chuardóidh muid an teachtaireacht earráide sa toradh nua le strace -f -o /tmp/rian -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 +++

Anois, sin rud éigin. Faigheann próiseas 21470 earráid "diúltaithe rochtana" agus iarracht á déanamh comhad a chruthú ag cosán tmp/spool.21470.1573692319.854640 (a bhaineann leis an eolaire oibre reatha). Dá mbeadh an t-eolaire oibre reatha ar eolas againn, bheadh ​​an cosán iomlán ar eolas againn freisin agus beimid in ann a dhéanamh amach cén fáth nach féidir leis an bpróiseas a chomhad sealadach a chruthú ann. Ar an drochuair, tá deireadh tagtha leis an bpróiseas cheana féin, mar sin ní féidir leat é a úsáid go díreach lsof -p 21470 chun an t-eolaire atá ann faoi láthair a aimsiú, ach is féidir leat oibriú sa treo eile - lorg glaonna córais PID 21470 a athraíonn an t-eolaire. (Mura bhfuil ceann ar bith ann, caithfidh PID 21470 iad a bheith faighte le hoidhreacht óna thuismitheoir, agus tá sé seo tríd cheana féin lsof -p Ní féidir a fháil amach.) Tá an glao córais seo chdir (atá éasca le fáil amach le cabhair ó innill chuardaigh nua-aimseartha ar líne). Agus seo é an toradh ar chuardaigh droim ar ais bunaithe ar na torthaí rian, an bealach ar fad chuig an bhfreastalaí 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 +++

(Má tá tú caillte, b'fhéidir gur mhaith leat mo phostáil roimhe seo a léamh faoi ​​* bhainistíocht próisis nix agus sliogáin.) Mar sin, ní bhfuair an freastalaí PID 20629 cead comhad a chruthú ag an gcosán /var/spool/cron/tmp/spool.21470.1573692319.854640. Is dócha gurb é an chúis atá leis seo ná na socruithe ceada córas comhaid clasaiceach. Déanaimis seiceáil:

# 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

Sin an áit a bhfuil an madra curtha! Ritheann an freastalaí mar chron úsáideora, ach níl cead ach ag root scríobh chuig an eolaire /var/spool/cron/tmp/. Ordú simplí chown cron /var/spool/cron/tmp/ bhfeidhmeoidh bcron oibriú i gceart. (Murarbh sin an fhadhb, is dócha gurb é an chéad amhrastach eile ná modúl slándála eithne cosúil le SELinux nó AppArmor, mar sin sheiceálfainn logáil na teachtaireachta eithne le dmsg.)

Ar an iomlán

Is féidir le rianta glaonna córais a bheith iontach do thosaitheoirí, ach tá súil agam gur léirigh mé gur bealach tapa iad chun rang iomlán fadhbanna imlonnaithe coitianta a dhífhabhtú. Samhlaigh go bhfuil tú ag iarraidh ilphróiseas a dhífhabhtú bcronag baint úsáide as dífhabhtóir céim ar chéim.

Teastaíonn scil chun torthaí rian a pharsáil ar gcúl feadh slabhra de ghlaonna córais, ach mar a dúirt mé, beagnach i gcónaí, ag baint úsáide as stríoc, Ní bhfaighidh mé ach an toradh rian agus táim ag lorg earráidí ag tosú ón deireadh. Ar aon nós, stríoc cabhraíonn sé liom go leor ama a shábháil ar dhífhabhtú. Tá súil agam go mbeidh sé úsáideach duitse freisin.

Foinse: will.com

Add a comment