Ҷойгиркунии нармафзор бо strace

Ҷойгиркунии нармафзор бо strace

Кори рӯзонаи ман асосан ҷобаҷогузории нармафзор аст, ки ин маънои онро дорад, ки ман вақти зиёдеро барои посух додан ба саволҳо сарф мекунам:

  • Ин нармафзор барои таҳиякунанда кор мекунад, аммо на барои ман. Чаро?
  • Дирӯз ин нармафзор барои ман кор мекард, аммо имрӯз кор намекунад. Чаро?

Ин як навъ ислоҳкунӣ аст, ки аз ислоҳи нармафзори муқаррарӣ каме фарқ мекунад. Ислоҳоти муқаррарӣ дар бораи мантиқи рамз аст, аммо ислоҳи ҷобаҷогузорӣ дар бораи ҳамкории байни код ва муҳити зист мебошад. Ҳатто агар решаи мушкилот хатои мантиқӣ бошад ҳам, далели он, ки ҳама чиз дар як мошини дигар кор мекунад ва дар мошини дигар не, маънои онро дорад, ки мушкилот дар муҳити атроф аст.

Ҳамин тавр, ба ҷои асбобҳои муқаррарии ислоҳкунӣ ба монанди gdb Ман маҷмӯи гуногуни абзорҳо барои ислоҳи ҷобаҷогузорӣ дорам. Ва асбоби дӯстдоштаи ман барои ҳалли мушкилот ба монанди "Чаро ин нармафзор барои ман кор намекунад?" даъват кард стресс.

Strace чист?

стресс воситаи "пайгирии зангҳои система" мебошад. Он дар ибтидо барои Linux сохта шуда буд, аммо ҳамон ҳиллаҳои ислоҳиро бо асбобҳо барои системаҳои дигар анҷом додан мумкин аст (DTrace ё ктраце).

Аризаи асосӣ хеле содда аст. Шумо танҳо лозим аст, ки strace -ро бо ягон фармон иҷро кунед ва он тамоми зангҳои системаро нест мекунад (гарчанде ки аввал шумо бояд онро худатон насб кунед стресс):

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

Ин зангҳои система чист? Ин чизе монанди API барои ядрои системаи оператсионӣ аст. Як замоне, нармафзор ба сахтафзоре, ки дар он кор мекунад, дастрасии мустақим дошт. Агар, масалан, ба он лозим буд, ки чизе дар экран намоиш диҳад, он бо портҳо ё регистрҳои харитаи хотира барои дастгоҳҳои видеоӣ бозӣ мекард. Вақте ки системаҳои компютерии бисёрҷабҳа маъмул шуданд, бесарусомонӣ ҳукмфармо шуд, зеро замимаҳои гуногун барои сахтафзор мубориза мебурданд. Хатогиҳо дар як замима метавонад дигаронро, агар тамоми системаро вайрон кунад. Пас аз он, дар CPU режимҳои имтиёзҳо (ё "муҳофизати ҳалқа") пайдо шуданд. Ядро аз ҳама имтиёзнок шуд: он дастрасии пурра ба сахтафзорро гирифт ва замимаҳои камтар имтиёзнокро тавлид кард, ки аллакай барои муошират бо сахтафзор тавассути зангҳои системавӣ аз ядро ​​дархост мекарданд.

Дар сатҳи бинарӣ, занги система аз занги функсионалии оддӣ каме фарқ мекунад, аммо аксари барномаҳо дар китобхонаи стандартӣ бастабандро истифода мебаранд. Онхое. китобхонаи стандартии POSIX C дорои занги функсия мебошад навиштан (), ки дорои тамоми коди мушаххаси меъморӣ барои занги система мебошад навиштан.

Ҷойгиркунии нармафзор бо strace

Хулоса, ҳама гуна робитаи байни барнома ва муҳити он (системаҳои компютерӣ) тавассути зангҳои системавӣ сурат мегирад. Аз ин рӯ, вақте ки нармафзор дар як мошини дигар кор мекунад, аммо на дар мошини дигар, хуб мебуд, ки ба натиҷаҳои пайгирии зангҳои система назар кунед. Аниқтараш, дар ин ҷо як рӯйхати нуқтаҳои маъмулӣ мавҷуданд, ки онҳоро бо истифода аз пайгирии зангҳои система таҳлил кардан мумкин аст:

  • I/O консол
  • Шабакаи I/O
  • Дастрасӣ ба системаи файлӣ ва файли ворид/х
  • Идоракунии умри риштаи раванд
  • Идоракунии хотираи сатҳи паст
  • Дастрасӣ ба драйверҳои мушаххаси дастгоҳ

Кай истифода бурдани strace?

Дар назария, стресс бо ягон барнома дар фазои корбар истифода мешавад, зеро ҳама гуна барнома дар фазои корбар бояд зангҳои системавӣ кунад. Он бо барномаҳои тартибдодашуда ва сатҳи паст самараноктар кор мекунад, аммо он инчунин бо забонҳои сатҳи баланд ба монанди Python кор мекунад, агар шумо метавонед садои иловагиро аз вақти корӣ ва тарҷумон бурида тавонед.

Бо тамоми шукӯҳу шаҳомати он стресс ҳангоми ислоҳи нармафзоре, ки дар як мошин хуб кор мекунад, зоҳир мешавад, вале ногаҳон кор дар мошини дигарро қатъ мекунад, дар бораи файлҳо, иҷозатҳо ё кӯшиши бемуваффақияти иҷрои баъзе фармонҳо ё чизи дигар тавлид мекунад... Афсӯс, аммо ин тавр нест. бо мушкилоти сатҳи баланд, ба монанди хатогиҳои тасдиқи сертификат, хеле хуб якҷоя кунед. Одатан, ин як комбинатсияро талаб мекунад стрессбаъзан ltrace ва асбобҳои сатҳи баландтар (ба монанди абзори сатри фармон мекушояд барои ислоҳи сертификат).

Мо ҳамчун мисол сервери мустақилро истифода мебарем, аммо пайгирии зангҳои системаро аксар вақт дар платформаҳои ҷойгиркунии мураккабтар анҷом додан мумкин аст. Шумо танҳо бояд асбобҳои дурустро интихоб кунед.

Мисоли оддии ислоҳи хатогиҳо

Фарз мекунем, ки шумо мехоҳед барномаи аҷиби сервери foo-ро иҷро кунед ва ин аст он чизе ки шумо бо он анҷом медиҳед:

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

Эҳтимол он файли конфигуратсияеро, ки шумо навишта будед, пайдо карда натавонист. Ин аз он сабаб рӯй медиҳад, ки баъзан вақте ки менеҷерони бастаҳо барнома тартиб медиҳанд, онҳо маконҳои интизории файлро бекор мекунанд. Ва агар шумо дастури насбкуниро барои як тақсимот риоя кунед, дар дигараш шумо файлҳои аз он ҷое, ки интизор будед, комилан фарқ мекунед. Агар дар паёми хатогӣ гуфта шавад, ки файли конфигуратсияро дар куҷо ҷустуҷӯ кардан лозим бошад, мушкилотро дар чанд сония ҳал кардан мумкин аст, аммо ин тавр нест. Пас ба куҷо назар кардан лозим аст?

Агар шумо ба рамзи сарчашма дастрасӣ дошта бошед, шумо метавонед онро хонед ва ҳама чизро фаҳмед. Нақшаи хуби эҳтиётӣ, аммо ҳалли зудтарин нест. Шумо метавонед ба ислоҳкунандаи қадам ба қадам ба монанди муроҷиат кунед gdb ва бубинед, ки барнома чӣ кор мекунад, аммо истифодаи абзоре самараноктар аст, ки махсус барои нишон додани ҳамкорӣ бо муҳити зист тарҳрезӣ шудааст: стресс.

хулоса стресс метавонад зиёдатӣ ба назар расад, аммо хушхабар ин аст, ки аксарияти онро метавон беэътиноӣ кард. Аксар вақт истифода бурдани оператори -o барои захира кардани натиҷаҳои пайгирӣ дар файли алоҳида муфид аст:

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

Тақрибан тамоми саҳифаи аввали баромад стресс - Ин одатан дар сатҳи паст омодагӣ ба парвоз аст. (Зангҳои зиёд ммап, муҳофизат кардан, брк барои чизҳое ба монанди ошкор кардани хотираи сатҳи паст ва намоиш додани китобхонаҳои динамикӣ.) Дар асл, ҳангоми ислоҳи натиҷа стресс Бехтараш аз охир хондан. Дар зер даъват хоҳад шуд навиштан, ки паёми хатогиро нишон медиҳад. Мо ба боло нигоҳ мекунем ва аввалин занги хатои система - зангро мебинем кушод, ки хато мекунад ЭНОЕНТ («файл ё директория ёфт нашуд») кӯшиши кушодан /etc/foo/config.json. Дар ин ҷо файли конфигуратсия бояд бошад.

Ин танҳо як мисол буд, аммо ман гуфта метавонам, ки 90% вақтеро, ки ман истифода мебарам стресс, аз ин дида душвортар коре нест. Дар зер дастури мукаммали ислоҳи ислоҳи қадам ба қадам оварда шудааст:

  • Аз сабаби паёми норавшан дар бораи хатои системавӣ аз барнома хафа шавед
  • Барномаро бо аз нав оғоз кунед стресс
  • Паёми хатогиро дар натиҷаҳои пайгирӣ пайдо кунед
  • То он даме, ки занги аввалини нокоми системаро пахш кунед, баландтар шавед

Эҳтимол дорад, ки занги система дар қадами 4 чӣ хатогиро ошкор кунад.

Маслиҳатҳо

Пеш аз он ки ба шумо намунаи ислоҳи мураккабтарро нишон диҳам, ман ба шумо чанд ҳиллаеро барои истифодаи самаранок нишон медиҳам стресс:

одам дусти шумост

Дар бисёр системаҳои *nix, рӯйхати пурраи зангҳои системаро ба ядро ​​тавассути иҷро кардан мумкин аст одам занг мезанад. Шумо чизҳоеро мебинед брк(2), ки ин маънои онро дорад, ки маълумоти бештарро тавассути иҷро кардан мумкин аст мард 2 брк.

Мошини хурд: мард 2 чангак ба ман саҳифаи ниҳонӣ нишон медиҳад чангак () в GNU libc, ки маълум мешавад, бо даъват ба амал бароварда мешавад клон (). Семантикаи занг Голф бетағйир мемонад, агар шумо бо истифода аз барнома нависед чангак (), ва паймоишро иҷро кунед - Ман ягон занг намеёбам Голф, ба чои онхо хоханд буд клон (). Чунин рейкҳо шуморо танҳо ба иштибоҳ меандозанд, агар шумо ба муқоисаи манбаъ бо баромад шурӯъ кунед стресс.

-o -ро барои захира кардани натиҷа дар файл истифода баред

стресс метавонад натиҷаи васеъ тавлид кунад, аз ин рӯ аксар вақт нигоҳ доштани натиҷаҳои пайгирӣ дар файлҳои алоҳида муфид аст (чунон ки дар мисоли боло). Ин инчунин барои пешгирӣ кардани иштибоҳ кардани баромади барнома бо баромад кӯмак мекунад стресс дар консол.

Барои дидани маълумоти бештари далелҳо -s -ро истифода баред

Шумо шояд пай бурда бошед, ки нимаи дуюми паёми хатогӣ дар мисоли дар боло зикршуда нишон дода нашудааст. Аз он сабаб стресс пешфарз танҳо 32 байти аввали аргументи сатрро нишон медиҳад. Агар шумо хоҳед, ки бештар бинед, чизе ба монанди илова кунед -Соли 128 ба занг стресс.

-y пайгирии файлҳо, розеткаҳо ва ғайраро осон мекунад.

"Ҳамааш файл аст" маънои онро дорад, ки системаҳои *nix ҳама I/O-ро бо истифода аз дескрипторҳои файл иҷро мекунанд, новобаста аз он ки ин ба файл ё шабака ё қубурҳои байнипротсессионӣ дахл дорад. Ин барои барномасозӣ қулай аст, аммо ҳангоми дидани чизи умумӣ пайгирӣ кардани воқеаи воқеаро душвор мегардонад хондан и навиштан дар система натиҷаҳои пайгирии занг.

Бо илова кардани оператор бале, шумо маҷбур хоҳед кард стресс ба ҳар як тавсифкунандаи файл дар баромад бо қайди он чизе ки он ба он ишора мекунад, эзоҳ диҳед.

Ба раванди аллакай иҷрошаванда бо -p** замима кунед

Тавре ки шумо дар мисоли зер мебинед, баъзан ба шумо лозим меояд, ки барномаеро, ки аллакай кор мекунад, пайгирӣ кунед. Агар маълум бошад, ки он ҳамчун раванди 1337 кор мекунад (масалан, аз баромад ps), пас шумо метавонед онро чунин пайгирӣ кунед:

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

Шояд шумо ба ҳуқуқҳои реша ниёз доред.

-f -ро барои назорат кардани равандҳои кӯдакон истифода баред

стресс Бо нобаёнӣ, он танҳо як равандро пайгирӣ мекунад. Агар ин раванд равандҳои кӯдакро тавлид кунад, он гоҳ занги система барои тавлиди раванди кӯдакро дидан мумкин аст, аммо зангҳои системавии раванди кӯдак намоиш дода намешаванд.

Агар шумо фикр кунед, ки хато дар раванди кӯдак аст, изҳоротро истифода баред -f, ин имкон медиҳад пайгирии он. Камбудии ин дар он аст, ки натиҷа шуморо боз ҳам бештар ошуфта мекунад. Кай стресс як раванд ё як риштаро пайгирӣ мекунад, он як ҷараёни ягонаи рӯйдодҳои зангро нишон медиҳад. Вақте ки он дар як вақт якчанд равандҳоро пайгирӣ мекунад, шумо метавонед оғози зангро бубинед, ки бо паём қатъ шудааст , баъд - як қатор зангҳо барои дигар шохаҳои иҷро ва танҳо баъд - охири аввалин <…зағди фокус аз сар гирифта шуд>. Ё ҳамаи натиҷаҳои паймоишро ба файлҳои гуногун тақсим кунед, инчунин бо истифода аз оператор -фф (тафсилот дар роҳбарӣ ба стресс).

Филтри пайҳо бо истифода аз -e

Тавре ки шумо мебинед, натиҷаи пайгирӣ як тӯдаи воқеии ҳамаи зангҳои имконпазири система мебошад. Парчам -e Шумо метавонед пайро филтр кунед (ниг роҳнамо ба стресс). Бартарии асосӣ дар он аст, ки он зудтар иҷро кардани пайгирии филтршуда назар ба анҷом додани пайгирии пурра ва сипас зудтар аст grep`дар. Ростӣ, ман қариб ҳамеша парвое надорам.

На ҳама хатогиҳо бад ҳастанд

Намунаи оддӣ ва маъмул ин барномаест, ки дар як вақт дар якчанд ҷой файлро ҷустуҷӯ мекунад, ба мисли ҷабҳае, ки дар ҷустуҷӯи директория, ки дорои файли иҷрошаванда аст:

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

Эвристика ба монанди "дархости охирин пеш аз гузориш додани хатогӣ" дар ёфтани хатогиҳои мувофиқ хуб аст. Ҳарчанд аз охир оғоз кардан мантиқист.

Дарсҳои барномасозии C метавонанд ба шумо дар фаҳмидани зангҳои система кӯмак расонанд.

Зангҳои стандартӣ ба китобхонаҳои C зангҳои системавӣ нестанд, балки танҳо як қабати тунуки рӯизаминӣ мебошанд. Ҳамин тавр, агар шумо ҳадди аққал каме дарк кунед, ки чӣ гуна ва чӣ кор кардан дар C, фаҳмидани натиҷаҳои пайгирии зангҳои система барои шумо осонтар мешавад. Масалан, шумо дар ислоҳи зангҳо ба системаҳои шабака мушкилот доред, ҳамон классикиро бинед Дастури Bija барои барномасозии шабака.

Мисоли мураккабтари ислоҳи хатогиҳо

Ман аллакай гуфтам, ки мисоли ислоҳи оддӣ намунаи он чизест, ки ман ҳангоми кор бо он бештар сару кор дорам стресс. Бо вуҷуди ин, баъзан тафтишоти воқеӣ талаб карда мешавад, бинобар ин дар ин ҷо як мисоли воқеии ислоҳи мукаммалтар аст.

бкрон - нақшаи коркарди вазифаҳо, татбиқи дигари демон * nix cron. Он дар сервер насб шудааст, аммо вақте касе кӯшиш мекунад, ки ҷадвалро таҳрир кунад, ин ҳодиса рӯй медиҳад:

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

Хуб, ин маънои онро дорад бкрон кӯшиш кард, ки файли муайянеро нависад, аммо ин натиҷа надод ва ӯ эътироф намекунад, ки чаро. Ошкор кардан стресс:

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

Паёми хатогӣ дар наздикии охирин вуҷуд дорад навиштан, аммо ин дафъа чизе дигар аст. Аввалан, ягон хатогии дахлдори занги система вуҷуд надорад, ки одатан пеш аз ин рух медиҳад. Дуюм, маълум аст, ки дар ҷое касе аллакай паёми хатогиро хондааст. Чунин ба назар мерасад, ки мушкилоти воқеӣ дар ҷои дигар аст, ва bcrontab танҳо паёмро бозмегардонад.

Агар шумо ба назар гиред мард 2 хондааст, шумо мебинед, ки аргументи аввал (3) тавсифкунандаи файл аст, ки *nix барои ҳама коркарди I/O истифода мебарад. Чӣ тавр ман метавонам фаҳмам, ки дескриптори 3 кадом файлро ифода мекунад? Дар ин ҳолат, шумо метавонед давидан стресс бо оператор бале (ба боло нигаред) ва он ба таври худкор ба шумо хабар медиҳад, аммо барои фаҳмидани ин чизҳо, донистани тарзи хондан ва таҳлил кардани натиҷаҳои пайгирӣ муфид аст.

Сарчашмаи дескриптори файл метавонад яке аз зангҳои зиёди система бошад (ҳамааш аз он вобаста аст, ки дескриптор барои чӣ - консол, розеткаи шабакавӣ, худи файл ё чизи дигар вобаста аст), аммо агар ин тавр бошад, мо ҷустуҷӯ мекунем зангҳо бо баргардонидани 3 (яъне мо дар натиҷаҳои пайгирӣ "= 3" -ро меҷӯем). Дар ин натиҷа 2-тои онҳо вуҷуд доранд: кушод дар хеле боло ва сессия Дар байн. кушод файлро мекушояд, вале наздик(3) он гоҳ нишон медиҳад, ки он боз баста мешавад. (Rake: тасвирҳои файлро ҳангоми кушода ва пӯшидан дубора истифода бурдан мумкин аст). Занг занед розетка () мувофиқ аст, зеро он охирини пеш аст хонед (), ва маълум мешавад, ки bcrontab бо чизе тавассути розетка кор мекунад. Сатри навбатӣ нишон медиҳад, ки дескриптори файл бо васлаки домени unix дар роҳ /var/run/bcron-spool.

Пас, мо бояд раванди алоқамандро пайдо кунем васлаки unix дар тарафи дигар. Барои ин мақсад якчанд ҳилаҳои тоза мавҷуданд, ки ҳардуи онҳо барои ислоҳи ҷойгиркунии сервер муфиданд. Аввалан, истифода бурдан аст netstat ё навтар ss (вазъи розетка). Ҳарду фармонҳо пайвастҳои шабакаи фаъоли системаро нишон медиҳанд ва изҳорот мегиранд -l розеткахои шунаванда, инчунин операторро тавсиф кунанд -p барои намоиш додани барномаҳои ба розетка пайвастшуда ҳамчун муштарӣ. (Вариантҳои муфиди бештар вуҷуд доранд, аммо ин ду барои ин вазифа кофӣ мебошанд.)

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

Ин нишон медиҳад, ки шунаванда фармон аст inixserver, бо протсессори ID 20629 кор мекунад. (Ва тасодуфан, он дескриптори файли 3-ро ҳамчун васлкунанда истифода мебарад.)

Воситаи дуюми воқеан муфид барои дарёфти ҳамон як маълумот номида мешавад лоф. Он ҳамаи файлҳои кушодаро (ё тавсифи файлҳоро) дар система номбар мекунад. Ё шумо метавонед дар бораи як файли мушаххас маълумот гиред:

# 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

Раванди 20629 сервери дарозмуддат аст, бинобар ин шумо метавонед онро ба он пайваст кунед стресс истифода бурдани чизе монанди strace -o /tmp/trace -p 20629. Агар шумо кори cronро дар терминали дигар таҳрир кунед, шумо натиҷаи пайгирии хатогиро хоҳед гирифт. Ва ин аст натиҷа:

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

(Охир қабул кардан () ҳангоми пайгирӣ анҷом намеёбад.) Боз ҳам, мутаассифона, ин натиҷа хатогиеро, ки мо ҷустуҷӯ дорем, дар бар намегирад. Мо ягон паёмеро намебинем, ки bcrontag ба розетка мефиристад ё аз розетка қабул мекунад. Ба ҷои ин, назорати пурраи раванд (Clone, интизор шавед 4, SIGCHLD ва ғ.) Ин раванд раванди кӯдакро ба вуҷуд меорад, ки, тавре ки шумо тахмин карда метавонед, кори воқеиро иҷро мекунад. Ва агар ба шумо лозим ояд, ки изи ӯро пайгирӣ кунед, ба занг илова кунед strace - f. Ин аст он чизе, ки мо ҳангоми ҷустуҷӯи паёми хато дар натиҷаи нав бо 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 +++

Акнун, ин чизест. Раванди 21470 ҳангоми кӯшиши сохтани файл дар роҳ хатои "дастрасӣ рад карда шуд" мегирад tmp/spool.21470.1573692319.854640 (вобаста ба феҳристи кории ҷорӣ). Агар мо танҳо директорияи кории ҷорӣро медонистем, мо инчунин роҳи пурраро медонистем ва метавонистем фаҳмем, ки чаро раванд файли муваққатии худро дар он эҷод карда наметавонад. Мутаассифона, ин раванд аллакай қатъ шудааст, бинобар ин шумо наметавонед танҳо истифода баред lsof -p 21470 барои пайдо кардани феҳристи ҷорӣ, аммо шумо метавонед дар самти муқобил кор кунед - зангҳои системаи PID 21470-ро ҷустуҷӯ кунед, ки директорияро тағир медиҳанд. (Агар вуҷуд надошта бошад, PID 21470 бояд онҳоро аз волидайни худ мерос гирифта бошад ва ин аллакай тавассути lsof -саҳ ёфтан мумкин нест.) Ин занги система аст чдир (ки бо ёрии системаҳои ҷустуҷӯии муосири онлайн пайдо кардан осон аст). Ва ин аст натиҷаи ҷустуҷӯҳои баръакс дар асоси натиҷаҳои пайгирӣ, то сервери 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 +++

(Агар шумо гум шуда бошед, шумо метавонед мақолаи қаблии маро хонед дар бораи *nix идоракунии процесс ва снарядхо.) Ҳамин тавр, сервери PID 20629 барои сохтани файл дар роҳ иҷозат нагирифтааст /var/spool/cron/tmp/spool.21470.1573692319.854640. Эҳтимол, сабаби ин танзимоти иҷозати системаи файлии классикӣ мебошад. Биёед тафтиш кунем:

# 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

Дар он чо сагро дафн мекунанд! Сервер ҳамчун cron корбар кор мекунад, аммо танҳо root барои навиштан ба директория иҷозат дорад /var/spool/cron/tmp/. Фармони оддӣ chown cron /var/spool/cron/tmp/ маҷбур хоҳад кард бкрон дуруст кор кардан. (Агар ин мушкил набуд, пас гумонбари эҳтимолии навбатӣ модули амнияти ядро ​​ба монанди SELinux ё AppArmor аст, аз ин рӯ ман сабти паёми ядроиро бо дмесг.)

Ҳамагӣ

Изҳороти зангҳои системавӣ барои шурӯъкунандагон метавонад хеле зиёд бошад, аммо ман умедворам, ки ман нишон додам, ки онҳо роҳи зуд барои ислоҳи тамоми синфи мушкилоти паҳнкунии умумӣ мебошанд. Тасаввур кунед, ки кӯшиши ислоҳи бисёрпросесро анҷом диҳед бкронбо истифода аз ислоҳкунандаи қадам ба қадам.

Таҳлили пайгирии натиҷаҳо дар баробари занҷири зангҳои система маҳоратро талаб мекунад, аммо тавре ки ман гуфтам, қариб ҳамеша, истифода стресс, Ман танҳо натиҷаи пайгирӣ мегирам ва хатогиҳоро аз охир меҷӯям. Ба ҳар ҳол, стресс ба ман кӯмак мекунад, ки вақти зиёдеро дар ислоҳи ислоҳот сарфа кунам. Умедворам, ки барои шумо низ муфид хоҳад буд.

Манбаъ: will.com

Илова Эзоҳ