Deburiga soo dejinta software leh xargo

Deburiga soo dejinta software leh xargo

Shaqadayda maalinlaha ah waxay u badan tahay soo dejinta software-ka, taas oo macnaheedu yahay in aan waqti badan ku bixiyo sidii aan uga jawaabi lahaa su'aalaha sida:

  • Software-kani wuxuu u shaqeeyaa horumariyaha, laakiin aniga iima shaqeeyo. Waa maxay sababtu?
  • Shalay software-kani wuu ii shaqeeyay, laakiin maanta ma jiro. Waa maxay sababtu?

Kani waa nooc ka mid ah wax-ka-saaridda oo waxyar ka duwan khaladka-fureeynta software-ka caadiga ah. Debutting joogto ah waxa ay ku saabsan tahay macquulka ah ee koodka, laakiin debutting geyntu waxa ay ku saabsan tahay isdhexgalka ka dhexeeya code iyo deegaanka. Xitaa haddii asalka dhibku yahay qalad macquul ah, xaqiiqda ah in wax walba ku shaqeeyaan hal mashiin oo aan ahayn mid kale waxay la macno tahay in dhibaatadu si uun uga jirto deegaanka.

Markaa halkii laga isticmaali lahaa aaladaha wax-ka-hortagga caadiga ah sida gdb Waxaan haystaa qalabyo kala duwan oo lagu diraayo khaladka. Iyo aaladda aan ugu jeclahay wax ka qabashada dhibaatada sida "Muxuu software-kani iigu shaqayn waayay?" loo yaqaan xarig.

Waa maxay xadhig?

xarig waa qalab loogu talagalay "raadinta wicitaanka nidaamka". Waxaa markii hore loo sameeyay Linux, laakiin isla tabaha qaladka ayaa lagu samayn karaa aaladaha nidaamyada kale (DTrace ama ktrace).

Codsiga aasaasiga ah waa mid aad u fudud. Kaliya waxaad u baahan tahay inaad ku socodsiiso amar kasta waxayna tuuri doontaa dhammaan wicitaannada nidaamka (in kasta oo marka hore aad u badan tahay inaad adigu rakibto xarig):

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

Waa maxay wicitaanada nidaamkan? Tani waa shay u eg API-ga kernelka nidaamka qalliinka. Beri hore, software-ku wuxuu si toos ah u galay qalabkii uu ku shaqayn jiray. Haddii, tusaale ahaan, ay u baahneyd inay wax ku soo bandhigto shaashadda, waxay ku ciyaartay dekedo ama diiwaannada xusuusta-khariidad ee aaladaha fiidiyowga. Markii nidaamyada kombuyuutarrada badan ay noqdeen kuwo caan ah, fowdo ayaa xukuntay iyadoo codsiyada kala duwan ay ku dagaalameen qalabka. Khaladaadka hal codsi ayaa hoos u dhigi kara kuwa kale, haddaysan ahayn nidaamka oo dhan. Kadibna qaababka mudnaanta (ama "ilaalinta giraanta") ayaa ka soo muuqday CPU. Kernelku waxa uu noqday kan ugu mudnaanta badan: waxa uu si buuxda u helay agabka, isaga oo dhalinaya codsiyo aan mudnaanta lahayn oo horeba u lahaa in laga codsado kernel-ka si ay ula falgalaan qalabka iyada oo loo marayo wicitaanada nidaamka.

Heerka binary, wicitaanka nidaamka wax yar ayuu ka duwan yahay wicitaanka shaqada ee fudud, laakiin barnaamijyada badankood waxay isticmaalaan duubka maktabadda caadiga ah. Kuwaas. Maktabadda caadiga ah ee POSIX C waxay ka kooban tahay wicitaan shaqo qor (), kaas oo ka kooban dhammaan koodka gaarka ah ee qaab-dhismeedka ee wicitaanka nidaamka ku qor.

Deburiga soo dejinta software leh xargo

Marka la soo koobo, is-dhexgal kasta oo ka dhexeeya codsiga iyo deegaankiisa (nidaamka kombuyuutarrada) waxaa lagu fuliyaa wicitaannada nidaamka. Sidaa darteed, marka kombuyuutarku ku shaqeeyo hal mashiin laakiin kuma shaqeynayo mid kale, way fiicnaan lahayd in la eego nidaamka raadinta natiijooyinka raadinta. Si gaar ah, halkan waa liis qodobbada caadiga ah oo lagu lafaguri karo iyadoo la adeegsanayo raadraaca wicitaanka nidaamka:

  • Console I/O
  • Shabakadda I/O
  • Helitaanka nidaamka faylka oo gal I/O
  • Maaraynta inta nolosha ee dunta geedi socodka
  • Maareynta xusuusta heerka hoose
  • Helitaanka wadayaasha aaladaha gaarka ah

Goorma ayaa la isticmaalayaa xargaha?

Aragti ahaan, xarig loo isticmaalo barnaamij kasta oo ku yaala booska isticmaalaha, sababtoo ah barnaamij kasta oo ku yaala booska isticmaalaha waa inuu sameeyaa wicitaano nidaam ah. Waxay si hufan ugu shaqeysaa barnaamijyo heer hoose ah oo la soo ururiyey, laakiin sidoo kale waxay la shaqeysaa luqado heer sare ah sida Python haddii aad ka jari karto dhawaaqa dheeraadka ah ee runtime iyo turjubaanka.

Dhammaan quruxdeeda xarig waxay muujisaa inta lagu jiro qaladka software-ka si fiican ugu shaqeeya hal mashiin, laakiin si lama filaan ah u joojiya shaqada kale, soo saarista farriimaha aan caddayn ee ku saabsan faylasha, ogolaanshaha, ama isku dayga aan lagu guulaysan ee lagu fulinayo amarada qaarkood ama wax kale ... Waa wax laga xumaado, laakiin ma dhicin. si fiican ugu darso dhibaatooyinka heerka sare ah sida khaladaadka xaqiijinta shahaadada. Caadi ahaan tani waxay u baahan tahay isku-dar xarigmararka qaar raad iyo aaladaha heerka sare ah (sida aaladda khadka taliska openssl si loo saxo shahaadada).

Waxaan u isticmaali doonaa tusaale ahaan server-ka taagan, laakiin nidaamka raadinta wicitaanka ayaa inta badan lagu samayn karaa meelo badan oo la geeyo. Kaliya waxaad u baahan tahay inaad doorato qalabka saxda ah.

Tusaalaha qaladka fudud

Aynu nidhaahno waxaad doonaysaa inaad socodsiiso codsiga foom ee la yaabka leh ee server-ka, waana tan waxa aad ku dhammaynayso:

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

Sida muuqata way wayday faylka qaabaynta ee aad qortay. Tani waxay dhacdaa sababtoo ah mararka qaarkood marka maamulayaasha baakadu ay ururiyaan arji, waxay meesha ka saaraan meelaha faylka la filayo. Oo haddii aad raacdo hagaha rakibaadda ee qaybinta, mid kale waxaad ka heli faylal gebi ahaanba ka duwan meeshii aad filaysay. Dhibaatada waxaa lagu xalin karaa dhowr ilbiriqsi gudahood haddii fariinta khaladka ah loo sheego meesha laga raadinayo faylka qaabeynta, laakiin ma dhicin. Haddaba halkee laga eegi karaa?

Haddii aad marin u leedahay koodhka isha, waad akhrin kartaa oo wax walba waad ogaan kartaa. Qorshe kayd ah oo wanaagsan, laakiin maaha xalka ugu dhakhsaha badan. Waxaad isticmaali kartaa tallaabo-tallaabo debugger sida gdb oo arag waxa barnaamijku qabto, laakiin aad bay waxtar u badan tahay in la isticmaalo qalab si gaar ah loogu habeeyey si uu u muujiyo isdhexgalka deegaanka: xarig.

gunaanad xarig waxaa laga yaabaa inay u ekaato mid aan loo baahnayn, laakiin warka wanaagsan ayaa ah in intiisa badan si badbaado leh loo iska indho tiri karo. Inta badan waa faa'iido in la isticmaalo hawlwadeenka -o si loo badbaadiyo natiijooyinka raadraaca fayl gaar ah:

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

Ku dhawaad ​​dhammaan bogga koowaad ee wax soo saarka xarig - Tani inta badan waa diyaarinta heer hoose ee bilaabista. (Wacitaanno badan mmap, toosin, quill waxyaabaha ay ka midka yihiin ogaanshaha xusuusta hoose iyo muujinta maktabado firfircoon xarig Way fiicantahay in la akhriyo ilaa dhamaadka. Hoos waxaa jiri doona caqabad ku qor, kaas oo soo bandhigaya fariin qalad ah. Waxaan fiirineynaa kor oo aragnaa wicitaankii ugu horreeyay ee nidaamka khaldan - wacitaanka furan, kaas oo tuuraya khalad ENOENT ("faylka ama hagaha lama helin") isku dayaya inuu furo /etc/foo/config.json. Tani waa meesha faylka qaabeynta uu ahaado.

Tani waxay ahayd tusaale, laakiin waxaan dhihi lahaa 90% wakhtiga aan isticmaalo xarig, ma jiro wax ka adag in la sameeyo tan. Hoos waxaa ah tilmaan dhammaystiran oo tallaabo-tallaabo ah:

  • Ka xanaaq sababtoo ah fariin aan caddayn oo ku saabsan khaladka nidaamka-y ee barnaamijka
  • Dib ugu bilow barnaamijka xarig
  • Ka hel fariinta khaladka ee natiijooyinka raadraaca
  • Sare u kac ilaa aad garaacdo wicitaankii ugu horeeyay ee nidaamka fashilmay

Waxay u badan tahay in nidaamka wicitaanka ee tallaabada 4 uu muujin doono wixii khaldamay.

Tilmaamo

Ka hor inta aanad ku tusin tusaale ka mid ah cilladaha kakan, waxaan ku tusi doonaa dhowr farsamooyin si waxtar leh loo isticmaalo xarig:

ninyahow waa saaxiibkaa

Nidaamyo badan oo *nix, liis dhamaystiran oo ah nidaamka wicitaanada kernel-ka ayaa lagu heli karaa socodsiinta man syscalls. Waxaad arki doontaa waxyaabo ay ka mid yihiin brk (2), taas oo macnaheedu yahay in macluumaad dheeraad ah lagu heli karo orodka nin 2 brk.

Qaado yar: nin 2 fargeeto waxay i tusinaysaa bogga qolofka fargeeto () Π² GNU libc, kaas oo, ay soo baxday, lagu hirgeliyay wicitaanka clone(). Wac semantics fargeeto ah waa sidii hore haddii aad barnaamij ku qorto adigoo isticmaalaya fargeeto (), oo raadi raad-raac - ma heli doono wax wicitaan ah fargeeto ah, beddelkooda waxaa jiri doona clone(). Jeexitaanka noocan oo kale ah ayaa kaliya ku wareerinaya haddii aad bilowdo inaad barbar dhigto isha iyo wax soo saarka xarig.

Isticmaal -o si aad u kaydiso wax soo saarka fayl

xarig waxay dhalin kartaa wax soo saar ballaaran, sidaas darteed inta badan waa faa'iido in lagu kaydiyo natiijooyinka raadinta faylal gaar ah (sida tusaalaha sare). Tani waxay sidoo kale kaa caawineysaa inaad iska ilaaliso soo saarista barnaamijka jaahwareerka leh xarig konsole-ka.

Isticmaal -s si aad u aragto xog badan oo dood ah

Waxaa laga yaabaa inaad dareentay in qaybta labaad ee fariinta qaladka aan lagu muujin raadraaca tusaalaha ah ee kore. Sababtu waa xarig Defaftirka ayaa muujinaya kaliya 32 bytes ee ugu horreeya ee doodda xadhigga. Haddii aad rabto inaad wax badan aragto, ku dar wax la mid ah -s 128 wacitaanka xarig.

-y waxay sahlaysaa in la raad raaco galalka, saldhigyada, iwm.

"Dhammaan waa fayl" macnaheedu waa *nix nidaamyada ay sameeyaan dhammaan I/O iyaga oo isticmaalaya sharraxayaasha faylalka, haddii ay khusayso fayl ama shabakad ama tuubooyinka dhexdhexaadinta. Tani waxay ku habboon tahay barnaamijyada, laakiin waxay adkeynaysaa in la socdo waxa run ahaantii socda markaad aragto wax caadi ah akhri ΠΈ ku qor Natiijooyinka raadraaca wac nidaamka.

Adigoo ku daray hawlwadeen -Ρƒ, waad qasbi doontaa xarig sharax fayl kasta oo ka mid ah wax-soo-saarka oo ku qor waxa uu tilmaamayo.

Ku lifaaq habsocod hore u socday oo leh -p**

Sida aad ka arki doonto tusaalaha hoose, mararka qaarkood waxaad u baahan tahay inaad raadiso barnaamij hore u socday. Haddii la og yahay in ay u socoto habka 1337 (ka dheh, ka soo baxa ps), ka dib waxaad u raadin kartaa sidan:

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

Waxaa laga yaabaa inaad u baahato xuquuqaha xididka.

Isticmaal -f si aad ula socoto hababka ilmaha

xarig Sida caadiga ah, waxay raad raacdaa hal hab oo kaliya. Haddii habkani uu dhaliyo hababka ilmaha, markaa nidaamka wicida si loo dhalo habka ubadka waa la arki karaa, laakiin nidaamka habraaca ilmaha lama soo bandhigi doono.

Haddii aad u malaynayso in khaladku ku jiro habsocodka ilmaha, isticmaal bayaanka -f, tani waxay awood u siin doontaa baafinteeda. Dhankeeda hoose ayaa ah in wax-soo-saarku uu ku jahawareerin doono xitaa in ka badan. Goorma xarig raad raac hal hab ama hal dun, waxa ay tusinaysaa hal socod oo ah dhacdooyinka wacitaanka. Marka ay raad raacdo habab badan hal mar, waxa laga yaabaa inaad aragto bilawga wicitaanka oo fariintu kala goysay , ka dibna - farabadan oo ah baaqyo loogu talagalay laamaha kale ee fulinta, ka dibna kaliya - dhamaadka kan ugu horreeya . Ama u qaybi dhammaan natiijooyinka raadinta faylal kala duwan, sidoo kale adoo isticmaalaya hawlwadeenka -ff (Faahfaahinta in hogaaminta on xarig).

Sifee raadadka adoo isticmaalaya -e

Sida aad arki karto, natiijada raadku waa raso dhab ah oo dhammaan wicitaannada nidaamka suurtagalka ah. Calan -e Waxaad shaandhayn kartaa raadka (eeg hage on xarig). Faa'iidada ugu weyni waa in ay ka dhakhso badan tahay in la socodsiiyo raad la sifeeyay halkii la samayn lahaa raad buuxa ka dibna dufan'iyo Si daacadnimo loo hadlo, had iyo jeer ma daneeyo.

Qaladaadka oo dhan ma wada xun yihiin

Tusaalaha fudud oo caam ah waa barnaamij ka raadinaya fayl dhowr meelood hal mar, sida qolof raadinaya hage ka kooban fayl la fulin karo:

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

Heuristics sida "codsigii u dambeeyay ee fashilmay ka hor inta aan la soo sheegin qalad" waxay ku fiican yihiin helitaanka khaladaadka khuseeya. Si kastaba ha ahaatee, waa macquul in laga bilaabo dhamaadka ugu dambeeya.

Casharrada barnaamijyada C waxay kaa caawin karaan inaad fahamto wicitaannada nidaamka.

Wicitaanada caadiga ah ee maktabadaha C ma aha wicitaano nidaam ah, laakiin kaliya lakab khafiif ah. Sidaa darteed, haddii aad fahamto ugu yaraan wax yar sida iyo waxa lagu sameeyo C, waxay kuu fududaan doontaa inaad fahamto natiijooyinka nidaamka wicitaanka raadraaca. Tusaale ahaan, waxaa dhib kugu ah inaad tirtirto wicitaanada nidaamka shabakada, fiiri isla classic Bija's Guide to Network Programming.

Tusaalo khaladaad badan oo kakan

Waxaan horey u sheegay in tusaalaha qaladka fudud uu yahay tusaale ka mid ah waxa aan inta badan la macaamilo markaan la shaqeynayo xarig. Si kastaba ha ahaatee, mararka qaarkood baaritaan dhab ah ayaa loo baahan yahay, markaa halkan waxaa ah tusaale nololeed oo dhab ah oo khaladaad heersare ah.

bron - Jadwalka habaynta hawsha, fulinta kale ee * nix daemon text. Waxaa lagu rakibay server-ka, laakiin marka qof isku dayo inuu wax ka beddelo jadwalka, tani waa waxa dhacaya:

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

Hagaag, taasi waxay ka dhigan tahay bron wuxuu isku dayay inuu qoro fayl gaar ah, laakiin ma aysan shaqayn, mana uu aqbali doono sababta. Daahfurka xarig:

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

Waxa jirta fariin khalad ah oo u dhaw dhamaadka ku qor, laakiin markan wax baa ka duwan. Marka hore, ma jiro qalad wicitaan oo ku habboon nidaamka, kaas oo badanaa dhaca ka hor intaanan. Marka labaad, way caddahay in meel qof hore u akhriyay fariinta qaladka. Waxay u egtahay in dhibaatada dhabta ah ay tahay meel kale, iyo bcrontab si fudud dib u ciyaarida fariinta.

Hadii aad eegto nin 2 akhri, waxaad arki kartaa in doodda koowaad (3) ay tahay sharraxaadda faylka, kaas oo *nix u isticmaalo dhammaan I/O processing. Sideen ku ogaan karaa faylka sharaxa 3 u taagan yahay? Xaaladdan gaarka ah, waad ordi kartaa xarig la shaqeeya -Ρƒ (kor eeg) oo si toos ah ayay kuu sheegi doontaa, laakiin si aad u ogaato waxyaalahan oo kale, waxaa faa'iido leh in la ogaado sida loo akhriyo oo loo kala saaro natiijooyinka raadinta.

Isha sharraxaadda faylka waxay noqon kartaa mid ka mid ah wicitaanno badan oo nidaamyo ah (dhammaantood waxay kuxirantahay waxa tilmaanta loogu talagalay - console, godad shabakad, faylka laftiisa, ama shay kale), laakiin sida ay suurtagal tahay, waxaan raadineynaa wicitaanada soo celinta 3 (ie. waxaan ka raadineynaa "= 3" natiijooyinka raadinta). Natiijadan waxaa jira 2 ka mid ah: furan meesha ugu sareysa iyo socket dhexe ee. furan furaya faylka laakiin ku dhow(3) waxay markaas tusi doontaa inay mar kale xidhidhayso. (Rake: Fayl gareeyayaasha dib ayaa loo isticmaali karaa marka la furo oo la xiro). Wac godka() ku haboon sababtoo ah waa tii u dambaysay ka hor akhri (), oo waxaa soo baxday in bcrontab uu ku shaqeeyo wax iyada oo loo marayo godad. Xariiqda xigta waxay muujineysaa in sharraxaadda faylka uu xiriir la leeyahay unix domain godka jidka /var/run/bcron-spool.

Markaa, waxaan u baahanahay inaan helno habka la xiriira godka unix dhanka kale. Waxaa jira dhowr xeeladood oo nadiif ah oo ujeeddadaas leh, labaduba waxay faa'iido u leeyihiin ciribtirka dejinta server-ka. Marka hore waa in la isticmaalo netstat ama ka cusub ss (xaaladda godka). Labada amarba waxay muujinayaan isku xirka shabakada firfircoon ee nidaamka oo qaado bayaanka -l si loo qeexo saldhigyada dhegeysiga, iyo sidoo kale hawlwadeenka -p si ay u muujiyaan barnaamijyada ku xiran godka sida macmiilka. (Waxaa jira fursado badan oo faa'iido leh, laakiin labadan ayaa ku filan hawshan.)

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

Tani waxay soo jeedinaysaa in dhagaystuhu yahay amarka inixserver, oo wata aqoonsiga nidaamka 20629. (Iyo, si kadis ah, waxay u isticmaashaa sharraxa faylka 3 sida godad.)

Qalabka labaad ee runtii waxtarka leh ee lagu helo macluumaad isku mid ah ayaa la yiraahdaa lsof. Waxay taxdaa dhammaan faylasha furan (ama sharraxayaasha faylka) ee nidaamka. Ama waxaad heli kartaa macluumaad ku saabsan hal fayl gaar ah:

# 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

Geedi socodka 20629 waa adeegaha cimriga dheer, si aad ugu lifaaqdo xarig isticmaalaya wax sida strace -o /tmp/trace -p 20629. Haddii aad ku tafatirto shaqada cron ee terminal kale, waxaad heli doontaa raadraac qalad ah. Natiijaduna waa tan:

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

(Ugu dambayn aqbal() lama dhamaystiri doono marka la raadinayo.) Mar labaad, nasiib daro, natiijadani kuma jirto khaladka aanu raadinayno. Ma aragno farriimaha ay bcrontag u soo dirto ama ka hesho godka. Taa beddelkeeda, dhammaystir habka xakamaynta (Gadzhiyev, sug4, SIGCHLD iwm.) Habkani waxa uu dhalinayaa habka ilmaha, kaas oo, sida aad qiyaasi karto, qabta shaqada dhabta ah. Oo haddii aad u baahan tahay inaad qabato raadkeeda, ku dar wicitaanka dhuuban -f. Tani waa waxa aan heli doono marka aan raadinno fariinta qaladka ee natiijada cusub ee leh 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 +++

Hadda, taasi waa wax. Habka 21470 wuxuu helayaa khalad "helitaanka la diiday" marka la isku dayayo in la abuuro fayl jidka tmp/spool.21470.1573692319.854640 (oo la xidhiidha hagaha shaqada ee hadda jira). Haddii aan ogaano tusaha shaqada ee hadda, waxaan sidoo kale ogaan lahayn dariiqa buuxa oo aan awoodno inaan ogaano sababta uu nidaamku u abuuri karin faylkiisa ku meel gaarka ah. Nasiib darro, hannaanku mar horeba wuu baxay, markaa ma isticmaali kartid oo keliya lsof -p 21470 Si aad u hesho hagaha hadda jira, laakiin waxaad u shaqayn kartaa jihada ka soo horjeeda - raadi nidaamka PID 21470 ee wicitaanada beddela tusaha. (Haddii aysan midna jirin, PID 21470 waa inay ka dhaxashay waalidkeed, tanina mar hore ayay soo martay. lsof -p lama ogaan karo.) Wicitaan nidaamkani waa chdir (taas oo ay fududahay in la ogaado iyada oo la kaashanayo matoorada casriga casriga ah ee internetka). Oo halkan waa natiijada raadinta rogaal celiska ah ee ku salaysan natiijooyinka raadraaca, dhammaan jidka loo maro server-ka 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 +++

(Haddii aad luntay, waxaa laga yaabaa inaad rabto inaad akhrido qoraalkaygii hore ku saabsan * maaraynta habka nix iyo qolofka.) Markaa, server-ka PID 20629 ma helin ogolaansho uu ku abuuro fayl jidka /var/spool/cron/tmp/spool.21470.1573692319.854640. Inta badan, sababta tani waa jaangooyooyinka oggolaanshaha nidaamka faylka caadiga ah. Aan hubino:

# 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

Halkaa eyga lagu aasay! Seerfarku wuxuu u shaqeeyaa sidii cron isticmaale, laakiin xidid kaliya ayaa fasax u haysta inuu wax u qoro hagaha /var/spool/cron/tmp/. Amarka fudud chown cron /var/spool/cron/tmp/ qasbi doono bron si sax ah u shaqeyso. (Haddii taasi aysan ahayn dhibaatadu, markaa tuhunka xiga ee ugu badan ee laga shakisan yahay waa moduleka amniga kernel sida SELinux ama AppArmor, markaa waxaan hubin lahaa log fariinta kernel dmesg.)

Wadarta

Raadinta wicitaanka nidaamka waxay noqon kartaa mid aad u adag qofka bilawga ah, laakiin waxaan rajeynayaa inaan tusay inay yihiin hab degdeg ah oo lagu saxo dhammaan fasalada dhibaatooyinka geynta caadiga ah. Bal qiyaas in aad isku daydo in aad saxdo hab-socodka badan broniyadoo la isticmaalayo tallaabo-tallaabo debugger.

Baarista natiijooyinka dib-u-dhaca ee silsiladda wicitaanka nidaamka waxay u baahan tahay xirfad, laakiin sidaan idhi, had iyo jeer, isticmaalka xarig, Kaliya waxaan helay natiijada raadadka oo raadiya khaladaadka laga bilaabo dhamaadka. Si kastaba ha ahaatee, xarig waxay iga caawisaa inaan waqti badan ku badbaadiyo khaladka. Waxaan rajeynayaa inay adigana faa'iido kuu yeelan doonto.

Source: www.habr.com

Add a comment