Debugging cleachdadh bathar-bog le strace

Debugging cleachdadh bathar-bog le strace

Is e cleachdadh bathar-bog a th’ anns an obair làitheil agamsa sa mhòr-chuid, agus tha sin a’ ciallachadh gu bheil mi a’ caitheamh tòrr ùine a’ feuchainn ri ceistean mar:

  • Bidh am bathar-bog seo ag obair airson an leasaiche, ach chan ann dhòmhsa. Carson?
  • An-dè dh’ obraich am bathar-bog seo dhòmhsa, ach an-diugh chan eil. Carson?

'S e seo seòrsa debugging a tha beagan eadar-dhealaichte bho cunbhalach debugging bathar-bog. Tha debugging cunbhalach mu dheidhinn loidsig a’ chòd, ach tha debugging cleachdadh mu dheidhinn an eadar-obrachadh eadar an còd agus an àrainneachd. Eadhon ged a tha freumh na duilgheadas na mhearachd loidsigeach, tha an fhìrinn gu bheil a h-uile dad ag obair air aon inneal agus chan ann air inneal eile a ’ciallachadh gu bheil an duilgheadas ann an dòigh air choreigin san àrainneachd.

Mar sin an àite na h-innealan deasbaid àbhaisteach mar gdb Tha seata innealan eadar-dhealaichte agam airson cleachdadh debugging. Agus an inneal as fheàrr leam airson dèiligeadh ris an duilgheadas mar “Carson nach eil am bathar-bog seo ag obair dhòmhsa?” ghairm srath.

Dè th' ann an strae?

srath na inneal airson “lorg gairm siostam”. Chaidh a chruthachadh an toiseach airson Linux, ach faodar na h-aon chleasan deasbaid a dhèanamh le innealan airson siostaman eile (DTrace no ktrace).

Tha an tagradh bunaiteach gu math sìmplidh. Feumaidh tu dìreach ruith gu teann le àithne sam bith agus fàgaidh e a h-uile gairm siostam (ged is dòcha gum feum thu fhèin a stàladh an toiseach srath):

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

Dè na gairmean siostam seo? Tha seo rudeigin mar API airson kernel an t-siostaim obrachaidh. Uair dhe na h-uairean, bha cothrom dìreach aig bathar-bog air a’ bhathar-cruaidh air an robh e a’ ruith. Nam feumadh e, mar eisimpleir, rudeigin a thaisbeanadh air an sgrion, chluich e le puirt no clàran le mapa cuimhne airson innealan bhidio. Nuair a dh’ fhàs mòr-chòrdte air siostaman coimpiutair ioma-ghnìomhach, bha caos a’ riaghladh leis gu robh diofar thagraidhean a’ sabaid thairis air a’ bhathar-chruaidh. Dh'fhaodadh mearachdan ann an aon aplacaid feadhainn eile a thoirt sìos, mura h-eil an siostam gu lèir. An uairsin nochd modhan sochair (no “dìon fàinne”) anns an CPU. B ’e an kernel an fheadhainn as sochairiche: fhuair e làn chothrom air a’ bhathar-cruaidh, a ’sìolachadh thagraidhean nach robh cho sochair agus a bha mar-thà ag iarraidh ruigsinneachd bhon kernel gus eadar-obrachadh leis a’ bhathar-cruaidh tro ghlaidhean siostaim.

Aig ìre binary, tha gairm siostam beagan eadar-dhealaichte bho ghairm gnìomh sìmplidh, ach bidh a ’mhòr-chuid de phrògraman a’ cleachdadh inneal-fhilleadh anns an leabharlann àbhaisteach. An fheadhainn sin. tha gairm gnìomh anns an leabharlann àbhaisteach POSIX C sgrìobh (), anns a bheil a h-uile còd ailtireachd sònraichte airson gairm an t-siostaim sgrìobhadh.

Debugging cleachdadh bathar-bog le strace

Ann an ùine ghoirid, thèid eadar-obrachadh sam bith eadar tagradh agus an àrainneachd aige (siostaman coimpiutair) a dhèanamh tro ghlaidhean siostaim. Mar sin, nuair a bhios bathar-bog ag obair air aon inneal ach chan ann air inneal eile, bhiodh e math sùil a thoirt air toraidhean lorg gairm an t-siostaim. Gu sònraichte, seo liosta de phuingean àbhaisteach a dh’ fhaodar a sgrùdadh le bhith a’ cleachdadh lorg gairm siostam:

  • Console I/O
  • Lìonra I/O
  • Cothrom air siostam faidhle agus faidhle I/O
  • A 'riaghladh fad beatha snàithlean pròiseas
  • Stiùireadh cuimhne aig ìre ìosal
  • Cothrom air draibhearan inneal sònraichte

Cuin a chleachdas tu Strace?

Ann an teòiridh, srath air a chleachdadh le prògram sam bith ann an àite luchd-cleachdaidh, oir feumaidh prògram sam bith ann an àite luchd-cleachdaidh fiosan siostam a dhèanamh. Bidh e ag obair nas èifeachdaiche le prògraman cruinn, ìre ìosal, ach bidh e cuideachd ag obair le cànanan àrd-ìre mar Python mas urrainn dhut gearradh tron ​​​​fhuaim a bharrachd bhon ùine ruith agus eadar-theangair.

Anns a ghlòir gu lèir srath ga nochdadh fhèin aig àm deasbaid bathar-bog a bhios ag obair gu math air aon inneal, ach gu h-obann stadaidh e ag obair air inneal eile, a’ toirt a-mach teachdaireachdan neo-shoilleir mu fhaidhlichean, ceadan, no oidhirpean neo-shoirbheachail gus òrdughan no rudeigin eile a chuir an gnìomh... Tha e duilich, ach chan eil cuir còmhla cho math ri duilgheadasan àrd-ìre leithid mearachdan dearbhaidh teisteanais. Mar as trice feumaidh seo measgachadh srathuaireannan l lorg agus innealan ìre nas àirde (mar an inneal loidhne-àithne openssl gus an teisteanas a dhì-cheadachadh).

Cleachdaidh sinn frithealaiche leis fhèin mar eisimpleir, ach gu tric faodar lorg fiosan siostaim a dhèanamh air àrd-ùrlaran cleachdadh nas iom-fhillte. Feumaidh tu dìreach na h-innealan ceart a thaghadh.

Eisimpleir debugging sìmplidh

Canaidh sinn gu bheil thu airson an tagradh frithealaiche iongantach foo a ruith, agus is e seo a bhios agad:

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

A rèir choltais cha b' urrainn dha am faidhle rèiteachaidh a sgrìobh thu a lorg. Bidh seo a’ tachairt oir uaireannan nuair a bhios manaidsearan pacaid a’ cur ri chèile tagradh, bidh iad a’ dol thairis air na h-àiteachan faidhle ris a bheil dùil. Agus ma leanas tu an stiùireadh stàlaidh airson aon sgaoileadh, ann an tè eile lorgaidh tu faidhlichean gu tur eadar-dhealaichte bhon àite a bha dùil agad. Dh’ fhaodadh an duilgheadas a bhith air a rèiteach ann an diog no dhà nam biodh an teachdaireachd mearachd ag innse càite am bu chòir dhut coimhead airson am faidhle rèiteachaidh, ach chan eil. Mar sin càite am faic thu?

Ma tha cothrom agad air a’ chòd stòr, faodaidh tu a leughadh agus faighinn a-mach a h-uile càil. Plana cùl-taic math, ach chan e am fuasgladh as luaithe. Faodaidh tu tadhal air mar neach-debugger ceum air cheum gdb agus faic dè nì am prògram, ach tha e tòrr nas èifeachdaiche inneal a chleachdadh a tha air a dhealbhadh gu sònraichte gus eadar-obrachadh leis an àrainneachd a nochdadh: srath.

co-dhùnadh srath is dòcha gu bheil coltas gun fheum, ach is e an deagh naidheachd gum faodar a’ mhòr-chuid dheth a leigeil seachad gu sàbhailte. Gu tric tha e feumail an gnìomhaiche -o a chleachdadh gus toraidhean lorg a shàbhaladh gu faidhle air leth:

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

Mu thuairmeas a’ chiad duilleag toraidh gu lèir srath - Mar as trice is e seo ullachadh ìre ìosal airson a chuir air bhog. (Tòrr gairmean mmap, dìon, cuibhrig airson rudan mar a bhith a’ lorg cuimhne aig ìre ìosal agus a’ taisbeanadh leabharlannan fiùghantach.) Gu fìrinneach, rè debugging an toraidh srath Tha e nas fheàrr leughadh bhon fhìor cheann. Bidh dùbhlan gu h-ìosal sgrìobhadh, a sheallas teachdaireachd mearachd. Bidh sinn a 'coimhead gu h-àrd agus a' faicinn a 'chiad ghairm siostam mearachdach - a' ghairm fosgailt, a thilgeas mearachd EOIN (“cha deach faidhle no eòlaire a lorg”) a’ feuchainn ri fhosgladh /etc/foo/config.json. Seo far am bu chòir am faidhle rèiteachaidh a bhith.

Cha robh an seo ach eisimpleir, ach chanainn 90% den ùine a bhios mi a’ cleachdadh srath, chan eil dad nas duilghe a dhèanamh na seo. Gu h-ìosal tha stiùireadh dearbhaidh ceum air cheum iomlan:

  • Faigh troimhe-chèile air sgàth teachdaireachd neo-shoilleir mu mhearachd system-y bho phrògram
  • Ath-thòisich am prògram le srath
  • Lorg an teachdaireachd mearachd anns na toraidhean lorg
  • Gabh nas àirde gus an do bhuail thu a’ chiad ghairm siostam a dh’ fhàillig

Tha e glè choltach gun nochd gairm an t-siostaim ann an ceum 4 dè chaidh ceàrr.

Molaidhean

Mus seall thu dhut eisimpleir de debugging nas iom-fhillte, seallaidh mi dhut beagan chleasan airson a chleachdadh gu h-èifeachdach srath:

is e duine do charaid

Air mòran de shiostaman *nix, gheibhear liosta iomlan de ghairmean siostam chun kernel le bhith a’ ruith fear sycalls. Chì thu rudan mar brk(2), a tha a 'ciallachadh gum faighear barrachd fiosrachaidh le bhith a' ruith fear 2 brk.

Raca beag: fear 2 forc seall dhomh duilleag na slige forc () в GNU libc, a tha, tha e a 'tionndadh a-mach, air a chur an gnìomh le bhith a' gairm clone (). Cuir fòn gu semantics Fork fhathast an aon rud ma sgrìobhas tu prògram a’ cleachdadh forc (), agus ruith lorg - chan fhaigh mi fiosan sam bith Fork, 'n an àite sin bithidh clone (). Cha bhith na ràcan sin a’ cur dragh ort ach ma thòisicheas tu a’ dèanamh coimeas eadar an stòr agus an toradh srath.

Cleachd -o gus an toradh a shàbhaladh gu faidhle

srath comasach air toradh farsaing a ghineadh, agus mar sin tha e gu tric feumail toraidhean lorg a stòradh ann am faidhlichean fa leth (mar a chithear san eisimpleir gu h-àrd). Bidh seo cuideachd a’ cuideachadh le bhith a’ seachnadh toraidhean prògram troimh-chèile le toradh srath anns a’ chonsal.

Cleachd -s gus barrachd dàta argamaid fhaicinn

Is dòcha gu bheil thu air mothachadh nach eil an dàrna leth den teachdaireachd mearachd ri fhaicinn san eisimpleir gu h-àrd. 'S ann air sgàth srath chan eil bunaiteach a’ sealltainn ach a’ chiad 32 byte den argamaid sreang. Ma tha thu airson barrachd fhaicinn, cuir rudeigin mar seo ris 128 ris a' ghairm srath.

-y ga dhèanamh nas fhasa sùil a chumail air faidhlichean, socaidean, msaa.

Tha “All is file” a’ ciallachadh gu bheil *nix system a’ dèanamh a h-uile I/O a’ cleachdadh tuairisgeulan faidhle, ge bith a bheil sin a’ buntainn ri faidhle no lìonra no pìoban eadar-phròiseas. Tha seo goireasach airson prògramadh, ach ga dhèanamh duilich sùil a chumail air na tha a’ dol air adhart nuair a chì thu cumanta leughadh и sgrìobhadh ann an toraidhean lorg gairm an t-siostaim.

Le bhith a 'cur gnìomhaiche ris y, bheir thu buaidh srath cuir nota air gach tuairisgeul faidhle san toradh le nota de na tha e a’ comharrachadh.

Ceangail ri pròiseas a tha a’ ruith mu thràth le -p**

Mar a chì thu bhon eisimpleir gu h-ìosal, uaireannan feumaidh tu lorg a dhèanamh air prògram a tha a’ ruith mu thràth. Ma tha fios gu bheil e a’ ruith mar phròiseas 1337 (can, bhon toradh ps), an uairsin faodaidh tu a lorg mar seo:

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

Is dòcha gu bheil feum agad air còraichean root.

Cleachd -f airson sùil a chumail air pròiseasan chloinne

srath Gu gnàthach, chan eil e a’ lorg ach aon phròiseas. Ma tha am pròiseas seo a 'sìolachadh phròiseasan chloinne, an uairsin chithear gairm an t-siostaim gus pròiseas an leanaibh a shìolachadh, ach cha tèid fiosan siostam pròiseas an leanaibh a thaisbeanadh.

Ma tha thu a’ smaoineachadh gu bheil a’ mhearachd ann am pròiseas cloinne, cleachd an aithris -f, bheir seo comas dha lorg. Is e an eas-bhuannachd a tha seo gum bi an toradh a’ cur troimh-chèile eadhon nas motha dhut. Cuin srath lorg aon phròiseas no aon snàithlean, tha e a’ sealltainn aon shruth de thachartasan gairm. Nuair a bhios e a’ lorg grunn phròiseasan aig an aon àm, is dòcha gum faic thu toiseach gairm air a chuir stad le teachdaireachd , an uairsin - dòrlach de ghairmean airson meuran cur gu bàs eile, agus dìreach an uairsin - deireadh a’ chiad fhear <…foocall air ath-thòiseachadh>. No roinn a h-uile toradh lorg ann am faidhlichean eadar-dhealaichte, a’ cleachdadh a’ ghnìomhaiche cuideachd -ff (mion-fhiosrachadh ann an stiùireadh air a ' srath).

Filter lorgan a’ cleachdadh -e

Mar a chì thu, tha toradh an t-seallaidh na fhìor chruinneachadh de gach gairm siostam a dh’ fhaodadh a bhith ann. Bratach -e Faodaidh tu an lorg a shìoladh (faic stiùireadh air a ' srath). Is e am prìomh bhuannachd gu bheil e nas luaithe lorg sìoltachaidh a ruith na bhith a’ dèanamh làn lorg agus an uairsin grep`aig. Gus a bhith onarach, cha mhòr nach eil dragh sam bith orm.

Chan eil a h-uile mearachd dona

Is e eisimpleir sìmplidh is cumanta prògram a tha a’ coimhead airson faidhle ann an grunn àiteachan aig an aon àm, mar shlige a’ coimhead airson eòlaire anns a bheil faidhle so-ghnìomhaichte:

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

Tha heuristics mar “an t-iarrtas mu dheireadh a dh’ fhàillig mus tug thu cunntas air mearachd ”math air mearachdan buntainneach a lorg. Biodh sin mar a dh’ fhaodadh e, tha e loidsigeach tòiseachadh bhon fhìor cheann.

Faodaidh clasaichean prògramadh C do chuideachadh le bhith a’ tuigsinn fiosan siostaim.

Chan e gairmean siostam a th’ ann an gairmean àbhaisteach gu leabharlannan C, ach dìreach sreath tana de uachdar. Mar sin, ma thuigeas tu co-dhiù beagan ciamar agus dè a nì thu ann an C, bidh e nas fhasa dhut toraidhean lorg gairm an t-siostaim a thuigsinn. Mar eisimpleir, tha duilgheadas agad debugging fiosan gu siostaman lìonra, thoir sùil air an aon clasaig Stiùireadh Bija air Prògramadh Lìonra.

Eisimpleir debugging nas iom-fhillte

Thuirt mi mu thràth gu bheil an eisimpleir de debugging sìmplidh na eisimpleir de na dh'fheumas mi dèiligeadh ris mar as trice nuair a bhios mi ag obair leis srath. Ach, uaireannan bidh feum air fìor sgrùdadh, agus mar sin seo eisimpleir fìor de dhearbhadh nas adhartaiche.

bcron - clàr-obrach giollachd gnìomh, buileachadh eile den * nix daemon cron. Tha e air a stàladh air an fhrithealaiche, ach nuair a dh'fheuchas cuideigin ris a' chlàr a dheasachadh, seo mar a thachras:

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

Ceart gu leòr, tha sin a’ ciallachadh bcron dh’ fheuch e ri faidhle sònraichte a sgrìobhadh, ach cha do dh’obraich e a-mach, agus chan aidich e carson. A 'faighinn a-mach srath:

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

Tha teachdaireachd mearachd faisg air an deireadh sgrìobhadh, ach an turas seo tha rudeigin eadar-dhealaichte. An toiseach, chan eil mearachd gairm siostam buntainneach ann, a bhios mar as trice a’ tachairt ron seo. San dàrna h-àite, tha e soilleir gu bheil cuideigin air an teachdaireachd mearachd a leughadh mu thràth. Tha e coltach gu bheil an fhìor dhuilgheadas an àiteigin eile, agus bcrontab dìreach a’ cluich an teachdaireachd air ais.

Ma sheallas tu air fear 2 a leughadh, chì thu gur e tuairisgeul faidhle a th’ anns a’ chiad argamaid (3), a bhios * nix a’ cleachdadh airson a h-uile giullachd I/O. Ciamar a gheibh mi a-mach dè tha tuairisgeul faidhle 3 a’ riochdachadh? Anns a 'chùis shònraichte seo, faodaidh tu ruith srath le gnìomhaiche y (faic gu h-àrd) agus innsidh e dhut gu fèin-ghluasadach, ach airson rudan mar seo obrachadh a-mach, tha e feumail fios a bhith agad mar a leughas tu agus a nì thu lorg air toraidhean.

Faodaidh tùs tuairisgeul faidhle a bhith mar aon de dh’ iomadh gairm siostaim (tha e uile an urra ri cò às a tha an tuairisgeul - consol, socaid lìonra, am faidhle fhèin, no rudeigin eile), ach biodh sin mar a dh’ fhaodadh, bidh sinn a’ coimhead airson gairmean le bhith a’ tilleadh 3 (i.e. bidh sinn a’ coimhead airson “= 3” anns na toraidhean lorg). Anns an toradh seo tha 2 dhiubh: fosgailt aig an fhìor mhullach agus socket Anns a 'mheadhan. fosgailt fosgail am faidhle ach dùin(3) an uairsin a 'sealltainn gu bheil e a' dùnadh a-rithist. (Rake: faodar tuairisgeulan faidhle ath-chleachdadh nuair a thèid am fosgladh agus an dùnadh). Call socaid () freagarrach oir is e am fear mu dheireadh a bh’ ann roimhe leugh (), agus tha e a 'tionndadh a-mach gu bheil bcrontab ag obair le rudeigin tro socaid. Tha an ath loidhne a’ sealltainn gu bheil an tuairisgeul faidhle co-cheangailte ri socaid fearainn unix Air an t-slighe /var/run/bcron-spool.

Mar sin, feumaidh sinn am pròiseas co-cheangailte a lorg socaid unix air an taobh eile. Tha cleas neo dhà ann airson an adhbhair seo, agus tha an dà chuid feumail airson cleachdadh frithealaiche a dhearbhadh. Is e a 'chiad fhear a chleachdadh lìn no nas ùire ss (inbhe socaid). Bidh an dà àithne a’ sealltainn ceanglaichean lìonra gnìomhach an t-siostaim agus a’ gabhail an aithris -l airson cunntas a thoirt air socaidean èisteachd, a bharrachd air a’ ghnìomhaiche -p gus prògraman ceangailte ris an t-socaid a thaisbeanadh mar neach-dèiligidh. (Tha tòrr a bharrachd roghainnean feumail ann, ach tha an dà rud seo gu leòr airson na h-obrach 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))

Tha seo a 'moladh gur e an neach-èisteachd an àithne frithealaiche inix, a’ ruith le ID pròiseas 20629. (Agus, le co-thuiteamas, bidh e a’ cleachdadh tuairisgeul faidhle 3 mar an t-socaid.)

Canar an dàrna inneal fìor fheumail airson an aon fhiosrachadh a lorg lof. Tha e ag ainmeachadh a h-uile faidhle fosgailte (no tuairisgeulan faidhle) air an t-siostam. No gheibh thu fiosrachadh mu aon fhaidhle sònraichte:

# 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

Tha pròiseas 20629 na fhrithealaiche fad-ùine, gus an urrainn dhut a cheangal ris srath a’ cleachdadh rudeigin mar strace -o /tmp/trace -p 20629. Ma dheasaicheas tu obair cron ann an inneal-crìochnachaidh eile, gheibh thu toradh lorg le mearachd. 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

(mu dheireadh gabhail () cha tèid a chrìochnachadh nuair a thathar a’ lorg.) A-rithist, gu mì-fhortanach, chan eil a’ mhearachd a tha sinn a’ sireadh anns an toradh seo. Chan fhaic sinn brath sam bith a chuireas bcrontag chun an t-sòcaid no a gheibh sinn às. An àite sin, cuir crìoch air smachd pròiseas (clone, feitheamh 4, SIGCHLD msaa) Bidh am pròiseas seo a’ sìolachadh pròiseas cloinne, a nì, mar a shaoileadh tu, an fhìor obair. Agus ma dh'fheumas tu a slighe a ghlacadh, cuir ris a 'ghairm sreath -f. Is e seo a lorgas sinn nuair a nì sinn sgrùdadh airson an teachdaireachd mearachd anns an toradh ùr le 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 +++

A-nis, sin rudeigin. Tha pròiseas 21470 a' faighinn mearachd "ruigsinneachd air a dhiùltadh" nuair a thathar a' feuchainn ri faidhle a chruthachadh aig an t-slighe tmp/spool.21470.1573692319.854640 (co-cheangailte ris an eòlaire obrach làithreach). Nam biodh sinn dìreach eòlach air an eòlaire obrach gnàthach, bhiodh fios againn cuideachd air an t-slighe slàn agus bhiodh e comasach dhuinn faighinn a-mach carson nach urrainn don phròiseas am faidhle sealach aige a chruthachadh ann. Gu mì-fhortanach, tha am pròiseas air a dhol a-mach mar-thà, agus mar sin chan urrainn dhut dìreach a chleachdadh meud -p 21470 gus an eòlaire gnàthach a lorg, ach faodaidh tu obrachadh an taobh eile - coimhead airson fiosan siostam PID 21470 a dh’ atharraicheas an eòlaire. (Mura h-eil gin ann, feumaidh PID 21470 a bhith air an sealbhachadh bho a phàrant, agus tha seo mar-thà troimhe lsof -p chan fhaighear a-mach.) Tha an gairm siostam seo chdir (a tha furasta faighinn a-mach le cuideachadh bho innealan rannsachaidh air-loidhne an latha an-diugh). Agus seo toradh rannsachaidhean air ais stèidhichte air na toraidhean lorg, fad na slighe gu frithealaiche 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 +++

(Ma tha thu air chall, is dòcha gum biodh tu airson mo phost roimhe a leughadh mu * riaghladh pròiseas nix agus sligean.) Mar sin, cha d’ fhuair am frithealaiche PID 20629 cead faidhle a chruthachadh aig an t-slighe /var/spool/cron/tmp/spool.21470.1573692319.854640. As dualtaiche, is e an adhbhar airson seo na roghainnean cead siostam faidhle clasaigeach. Feuch an dèan sinn sgrùdadh:

# 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 far a bheil an cù air a thiodhlacadh! Bidh am frithealaiche a’ ruith mar chron neach-cleachdaidh, ach chan eil ach cead aig root sgrìobhadh chun eòlaire /var/spool/cron/tmp/. Òrdugh sìmplidh chown cron /var/spool/cron/tmp/ bheir feachd bcron obraich gu ceart. (Mura b’ e sin an duilgheadas, is e an ath neach a tha fo amharas modal tèarainteachd kernel mar SELinux no AppArmor, agus mar sin bhithinn a ’toirt sùil air log teachdaireachd kernel le dmesg.)

Iomlan

Faodaidh comharran gairm siostaim a bhith uamhasach dha neach-tòiseachaidh, ach tha mi an dòchas gu bheil mi air sealltainn gur e dòigh luath a th’ annta air clas slàn de dhuilgheadasan cleachdadh cumanta a dheasbad. Smaoinich air feuchainn ri ioma-phròiseas a dhì-cheadachadh bcrona’ cleachdadh debugger ceum air cheum.

Le bhith a’ parsadh toraidhean lorg air ais air feadh sèine gairm an t-siostaim feumaidh sgil, ach mar a thuirt mi, cha mhòr an-còmhnaidh, a’ cleachdadh srath, Tha mi dìreach a’ faighinn an toradh lorg agus a’ coimhead airson mearachdan a’ tòiseachadh bhon deireadh. Co-dhiù, srath tha mi gam chuideachadh gus tòrr ùine a shàbhaladh air debugging. Tha mi an dòchas gum bi e feumail dhut cuideachd.

Source: www.habr.com

Cuir beachd ann