Debugging mapulogalamu kutumiza ndi strace

Debugging mapulogalamu kutumiza ndi strace

Ntchito yanga yatsiku nthawi zambiri imakhala yotumiza mapulogalamu, zomwe zikutanthauza kuti ndimathera nthawi yambiri ndikuyesera kuyankha mafunso monga:

  • Pulogalamuyi imagwira ntchito kwa wopanga, koma osati kwa ine. Chifukwa chiyani?
  • Dzulo pulogalamuyo inandigwira ntchito, koma lero sizitero. Chifukwa chiyani?

Uwu ndi mtundu wa debugging womwe ndi wosiyana pang'ono ndi wokhazikika wa mapulogalamu. Kuwongolera pafupipafupi kumakhudzana ndi malingaliro a code, koma kutumizirana mauthenga kumakhudzana ndi kulumikizana pakati pa kachidindo ndi chilengedwe. Ngakhale muzu wa vuto ndi zolakwika zomveka, mfundo yakuti chirichonse chimagwira ntchito pa makina amodzi osati pa china chimatanthauza kuti vuto liri mwanjira inayake m'chilengedwe.

Choncho m'malo mwachizolowezi debugging zida monga gdb Ndili ndi zida zosiyanasiyana zotumizira ma debugging. Ndipo chida chomwe ndimakonda kwambiri chothana ndi vuto ngati "Bwanji pulogalamuyo sigwira ntchito kwa ine?" kuyitanidwa chingwe.

Kodi strace ndi chiyani?

chingwe ndi chida cha "system call tracing". Idapangidwa koyambirira kwa Linux, koma zidule zomwezo zowongolera zitha kuchitidwa ndi zida zamakina ena (Malangizo kapena ktrace).

Ntchito yofunikira ndiyosavuta. Mukungoyenera kuyendetsa strace ndi lamulo lililonse ndipo imataya mafoni onse (ngakhale choyamba muyenera kuyiyika nokha. chingwe):

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

Kodi mafoni amachitidwe awa ndi chiyani? Ichi ndi china chake ngati API ya kernel yogwiritsira ntchito. Kalekale, mapulogalamu anali ndi mwayi wopita ku hardware yomwe imayendera. Ngati, mwachitsanzo, pakufunika kuwonetsa china chake pazenera, idasewera ndi madoko kapena zolembera zokumbukira pazida zamakanema. Pamene makompyuta ochita zinthu zambiri anayamba kutchuka, chipwirikiti chinakula pamene mapulogalamu osiyanasiyana amalimbana ndi hardware. Zolakwika pa pulogalamu imodzi zitha kugwetsa zina, ngati sizinthu zonse. Kenako njira zamwayi (kapena "chitetezo cha mphete") zidawonekera mu CPU. Kernel inakhala mwayi waukulu kwambiri: idalandira mwayi wokwanira ku hardware, ndikuyambitsa mapulogalamu opanda mwayi omwe adafunsidwa kale kuti alowe kuchokera ku kernel kuti agwirizane ndi hardware kudzera mu mafoni a dongosolo.

Pamulingo wa binary, kuyimba kwadongosolo kumasiyana pang'ono ndi kuyimba kosavuta, koma mapulogalamu ambiri amagwiritsa ntchito wrapper mulaibulale yokhazikika. Iwo. laibulale yokhazikika ya POSIX C ili ndi foni yogwira ntchito lembani (), yomwe ili ndi ma code onse okhudzana ndi kamangidwe ka foni yamakono kulemba.

Debugging mapulogalamu kutumiza ndi strace

Mwachidule, kuyanjana kulikonse pakati pa pulogalamu ndi chilengedwe chake (makompyuta apakompyuta) kumachitika kudzera pama foni amachitidwe. Chifukwa chake, mapulogalamu akamagwira ntchito pamakina amodzi koma osagwiritsa ntchito ina, zingakhale bwino kuyang'ana zotsatira zotsatiridwa ndi kuyitana kwadongosolo. Mwachindunji, nayi mndandanda wa mfundo zomwe zingawunikidwe pogwiritsa ntchito foni yam'manja:

  • Console I/O
  • Network I/O
  • Kufikira kwamafayilo ndi fayilo I/O
  • Kusamalira moyo wonse wa ulusi wa ndondomeko
  • Kuwongolera kukumbukira kwapang'onopang'ono
  • Kufikira madalaivala apadera azipangizo

Nthawi yogwiritsira ntchito strace?

M'malingaliro, chingwe amagwiritsidwa ntchito ndi pulogalamu iliyonse pamalo ogwiritsira ntchito, chifukwa pulogalamu iliyonse yomwe ili mu malo ogwiritsira ntchito iyenera kuyimba mafoni. Zimagwira ntchito bwino ndi mapulogalamu opangidwa, otsika, komanso zimagwiranso ntchito ndi zilankhulo zapamwamba monga Python ngati mungathe kudula phokoso lowonjezera kuchokera pa nthawi yothamanga ndi womasulira.

Mu ulemerero wake wonse chingwe imadziwonetsera yokha panthawi yowonongeka kwa mapulogalamu omwe amagwira ntchito bwino pamakina amodzi, koma mwadzidzidzi amasiya kugwira ntchito pa wina, kutulutsa mauthenga osadziwika bwino okhudza mafayilo, zilolezo, kapena kuyesa kosatheka kuchita malamulo ena kapena chinachake ... Ndizomvetsa chisoni, koma sizitero. kuphatikiza bwino kwambiri ndi zovuta zapamwamba monga zolakwika zotsimikizira satifiketi. Kawirikawiri izi zimafuna kuphatikiza chingwenthawi zina ltrace ndi zida zapamwamba (monga chida cha mzere wolamula openssl kuti musinthe satifiketi).

Tidzagwiritsa ntchito seva yoyimirira monga mwachitsanzo, koma kutsata kuyimba kwadongosolo kumatha kuchitika pamapulatifomu ovuta kwambiri. Mukungoyenera kusankha zida zoyenera.

Chitsanzo chosavuta chowongolera

Tiyerekeze kuti mukufuna kuyendetsa pulogalamu yodabwitsa ya seva foo, ndipo izi ndi zomwe mumathera nazo:

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

Zikuwoneka kuti sichinapeze fayilo yosinthira yomwe mudalemba. Izi zimachitika chifukwa nthawi zina oyang'anira phukusi akapanga pulogalamu, amapitilira malo omwe amayembekezeredwa. Ndipo ngati mutsatira kalozera woyika pakugawa kumodzi, kwina mumapeza mafayilo osiyana kwambiri ndi momwe mumayembekezera. Vutoli litha kuthetsedwa mumasekondi angapo ngati uthenga wolakwika ukunena komwe ungayang'ane fayilo yosinthira, koma sichoncho. Ndiye kuyang'ana kuti?

Ngati muli ndi code code, mukhoza kuwerenga ndi kupeza zonse. Dongosolo labwino losunga zobwezeretsera, koma osati yankho lachangu. Mutha kugwiritsa ntchito debugger pang'onopang'ono ngati gdb ndikuwona zomwe pulogalamuyo imachita, koma ndizothandiza kwambiri kugwiritsa ntchito chida chomwe chidapangidwa kuti chiwonetse kuyanjana ndi chilengedwe: chingwe.

Pomaliza chingwe zingawoneke ngati zosafunikira, koma nkhani yabwino ndiyakuti zambiri zitha kunyalanyazidwa. Nthawi zambiri zimakhala zothandiza kugwiritsa ntchito -o opareta kuti musunge zotsatira ku fayilo ina:

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

Pafupifupi tsamba lonse loyamba lazotulutsa chingwe - Izi nthawi zambiri zimakhala zotsika pokonzekera kuyambitsa. (Mafoni ambiri mmap, chitetezo, quill pa zinthu monga kuzindikira kukumbukira kwapang'onopang'ono ndi kuwonetsa malaibulale osinthika.) Kwenikweni, pakuchotsa zotulukapo. chingwe Ndi bwino kuwerenga kuchokera kumapeto. Padzakhala vuto pansipa kulemba, yomwe imawonetsa uthenga wolakwika. Timayang'ana pamwambapa ndikuwona kuyimba koyamba kolakwika - kuyimba openat, zomwe zimabweretsa cholakwika ENOENT ("fayilo kapena chikwatu sichinapezeke") kuyesa kutsegula /etc/foo/config.json. Apa ndipamene fayilo yosinthira iyenera kukhala.

Ichi chinali chitsanzo chabe, koma ndinganene 90% ya nthawi yomwe ndimagwiritsa ntchito chingwe, palibe chinthu chovuta kuchita kuposa ichi. M'munsimu muli wathunthu tsatane-tsatane debugging kalozera:

  • Kukhumudwa chifukwa cha uthenga wosamveka bwino wokhudza cholakwika cha system-y kuchokera ku pulogalamu
  • Yambitsaninso pulogalamuyo ndi chingwe
  • Pezani uthenga wolakwika muzotsatira
  • Pitani pamwamba mpaka mutagunda foni yoyamba yolephera

Ndizotheka kuti kuyimba kwadongosolo mu gawo 4 kuwulula zomwe zidalakwika.

Malangizo

Ndisanakuwonetseni chitsanzo cha zovuta zowonongeka, ndikuwonetsani njira zingapo zogwiritsira ntchito bwino chingwe:

mwamuna ndi bwenzi lako

Pazinthu zambiri za * nix, mndandanda wathunthu wamayimbidwe amachitidwe ku kernel ukhoza kupezeka pothamanga man syscalls. Mudzawona zinthu ngati bk (2), zomwe zikutanthauza kuti zambiri zitha kupezeka pothamanga munthu 2 brk.

Chitsamba chaching'ono: munthu 2 foloko amandiwonetsa tsamba la chipolopolo mphanda () Π² GNU libc, zomwe, zikuwonekera, zimayendetsedwa ndi kuyitana wojambula (). Itanani semantics Foloko imakhalabe chimodzimodzi ngati mulemba pulogalamu pogwiritsa ntchito mphanda (), ndikutsata - sindipeza mafoni aliwonse Foloko, m’malo mwawo padzakhala wojambula (). Ma rakes oterowo amakusokonezani ngati mutayamba kufananiza gwero ndi zotuluka chingwe.

Gwiritsani ntchito -o kusunga zotuluka ku fayilo

chingwe imatha kutulutsa zochulukirapo, chifukwa chake nthawi zambiri zimakhala zothandiza kusunga zotsatira m'mafayilo osiyanasiyana (monga momwe zilili pamwambapa). Izi zimathandizanso kupewa kusokoneza pulogalamu yotulutsa ndi zotuluka chingwe mu console.

Gwiritsani ntchito -s kuti muwone zambiri zotsutsana

Mwinamwake mwawona kuti theka lachiwiri la uthenga wolakwika silinasonyezedwe mu chitsanzo pamwambapa. Ndi chifukwa chingwe zosasintha zimangowonetsa ma byte 32 oyamba a mkangano wa zingwe. Ngati mukufuna kuwona zambiri, onjezani zina -s 128 ku kuitana chingwe.

-y imapangitsa kukhala kosavuta kutsatira mafayilo, sockets, etc.

"Zonse ndi fayilo" zikutanthauza kuti * nix machitidwe amachita zonse za I/O pogwiritsa ntchito zofotokozera mafayilo, kaya ndi fayilo kapena netiweki kapena mapaipi ophatikizira. Izi ndizosavuta kupanga mapulogalamu, koma zimapangitsa kuti zikhale zovuta kutsata zomwe zikuchitika mukamawona zofala werengani ΠΈ kulemba mu system call trace results.

Powonjezera woyendetsa inde, mudzakakamiza chingwe fotokozerani fayilo iliyonse yofotokozera muzotulutsa ndi cholembera cha zomwe ikulozera.

Gwirizanitsani ku njira yomwe ikuyenda kale ndi -p **

Monga momwe muwonera pachitsanzo chomwe chili pansipa, nthawi zina muyenera kutsata pulogalamu yomwe ikugwira ntchito kale. Ngati zimadziwika kuti zikuyenda ngati process 1337 (nenani, kuchokera pazotuluka ps), ndiye mutha kutsata motere:

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

Mungafunike ufulu wa mizu.

Gwiritsani ntchito -f kuyang'anira machitidwe a mwana

chingwe Mwachisawawa, imatsata ndondomeko imodzi yokha. Ngati ndondomekoyi imayambitsa ndondomeko ya mwana, ndiye kuti kuyitana kwadongosolo kuti kubereke mwana kumawoneka, koma kuyitana kwa dongosolo la mwanayo sikudzawonetsedwa.

Ngati mukuganiza kuti cholakwikacho chili m'kati mwa mwana, gwiritsani ntchito mawuwo -f, izi zidzathandiza kufufuza kwake. Choyipa cha izi ndikuti zotsatira zake zidzakusokonezani kwambiri. Liti chingwe imatsata ndondomeko imodzi kapena ulusi umodzi, imasonyeza mtsinje umodzi wa zochitika zoyimba. Ikatsata njira zingapo nthawi imodzi, mutha kuwona kuyamba kwa kuyimba kusokonezedwa ndi uthenga , ndiye - mulu wa maitanidwe a nthambi zina zakupha, ndipo pokhapo - kutha kwa woyamba <…foocall yayambiranso>. Kapena gawani zotsatira zonse m'mafayilo osiyanasiyana, pogwiritsa ntchito opareshoni -ff (zambiri mu utsogoleri pa chingwe).

Zosefera zosefera pogwiritsa ntchito -e

Monga mukuonera, zotsatira za kufufuza ndi mulu weniweni wa mafoni onse zotheka dongosolo. Mbendera -e Mutha kusefa zotsatsira (onani kalozera pa chingwe). Ubwino waukulu ndikuti ndikuthamanga kuthamanga kosasefera kuposa kuchita zonse kenako grep`pa. Kunena zowona, pafupifupi nthawi zonse sindisamala.

Sikuti zolakwa zonse zimakhala zoipa

Chitsanzo chosavuta komanso chodziwika bwino ndi pulogalamu yomwe ikuyang'ana fayilo m'malo angapo nthawi imodzi, monga chipolopolo chomwe chikuyang'ana chikwatu chomwe chili ndi fayilo yotheka:

$ 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 ngati "pempho lolephera lomaliza musananene cholakwika" ndiabwino kupeza zolakwika. Zikhale choncho, ndi zomveka kuyambira kumapeto kwenikweni.

Maphunziro a pulogalamu ya C atha kukuthandizani kumvetsetsa mafoni amtundu.

Kuyitanira kokhazikika ku malaibulale a C sikuyimba foni, koma ndi gawo lochepa chabe. Chifukwa chake, ngati mumvetsetsa pang'ono momwe ndi momwe mungachitire mu C, kudzakhala kosavuta kuti mumvetsetse zotsatira za foni yam'manja. Mwachitsanzo, muli ndi vuto kuchotsa mafoni ku machitidwe a netiweki, yang'anani zachikale zomwezo Bija's Guide to Network Programming.

Chitsanzo chodetsa nkhawa kwambiri

Ndanena kale kuti chitsanzo cha kuwongolera kosavuta ndi chitsanzo cha zomwe ndimayenera kukumana nazo ndikamagwira ntchito chingwe. Komabe, nthawi zina kufufuza kwenikweni kumafunika, ndiye apa pali chitsanzo chenicheni cha kuwongolera kwapamwamba kwambiri.

bcron - Wokonza ntchito, kukhazikitsa kwina kwa * nix daemon cron. Zayikidwa pa seva, koma wina akayesa kusintha ndandanda, izi ndi zomwe zimachitika:

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

Chabwino, izo zikutanthauza bcron anayesa kulemba fayilo inayake, koma sizinathandize, ndipo sangavomereze chifukwa chake. Kuvundukula chingwe:

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

Pali uthenga wolakwika pafupi ndi kumapeto kulemba, koma nthawi ino zinthu zasintha. Choyamba, palibe cholakwika chilichonse choyimba foni, chomwe nthawi zambiri chimachitika izi zisanachitike. Kachiwiri, zikuwonekeratu kuti penapake wina wawerenga kale uthenga wolakwika. Zikuwoneka ngati vuto lenileni lili kwinakwake, ndipo bcrontab amangobweza uthengawo.

Ngati muyang'ana munthu 2 kuwerenga, mutha kuwona kuti mkangano woyamba (3) ndi wofotokozera mafayilo, omwe * nix amagwiritsa ntchito pokonza zonse za I/O. Kodi ndimadziwa bwanji kuti fayilo yofotokozera 3 ikuyimira? Pankhaniyi, mukhoza kuthamanga chingwe ndi opareshoni inde (onani pamwambapa) ndipo idzakuuzani zokha, koma kuti mudziwe zinthu ngati izi, ndizothandiza kudziwa kuwerenga ndikuwunika zotsatira.

Gwero la ofotokozera mafayilo likhoza kukhala limodzi mwamayitanidwe ambiri (zonse zimatengera zomwe kufotokozera - console, socket network, fayilo yokha, kapena china chake), koma zikhale momwe zingakhalire, timayang'ana. kuyimba pobwezera 3 (ie .e. timayang'ana "= 3" muzotsatira). Pazotsatira izi pali 2 mwa izo: openat pamwamba kwambiri ndi zitsulo Pakati. openat amatsegula fayilo koma pafupi(3) idzasonyeza kuti ikutsekanso. (Rake: Zofotokozera zamafayilo zitha kugwiritsidwanso ntchito zikatsegulidwa ndi kutsekedwa). Imbani zitsulo () yabwino chifukwa ndi yomaliza kale werengani (), ndipo zikuwoneka kuti bcrontab imagwira ntchito ndi china chake kudzera mu socket. Mzere wotsatira ukuwonetsa kuti chofotokozera cha fayilo chikugwirizana ndi unix domain socket panjira /var/run/bcron-spool.

Choncho, tiyenera kupeza ndondomeko zogwirizana ndi unix socket mbali inayo. Pali zidule zingapo zabwino pazifukwa izi, zonse zomwe ndi zothandiza pakuwongolera ma seva. Yoyamba ndiyo kugwiritsa ntchito netstat kapena zatsopano ss (socket status). Malamulo onsewa akuwonetsa kulumikizana kwa netiweki yogwira ntchito ndikutenga mawuwo -l kufotokoza zitsulo zomvetsera, komanso wogwiritsa ntchito -p kuwonetsa mapulogalamu olumikizidwa ku socket ngati kasitomala. (Pali zosankha zambiri zothandiza, koma ziwirizi ndizokwanira pa ntchitoyi.)

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

Izi zikusonyeza kuti womvera ndiye lamulo inixserver, ikuyenda ndi ndondomeko ID 20629. (Ndipo, mwangozi, imagwiritsa ntchito chofotokozera 3 cha fayilo ngati socket.)

Chida chachiwiri chothandiza kwambiri chopezera chidziwitso chomwechi chimatchedwa lsof. Imalemba mafayilo onse otseguka (kapena ofotokozera mafayilo) pamakina. Kapena mutha kudziwa zambiri za fayilo imodzi:

# 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

Process 20629 ndi seva yanthawi yayitali, kotero mutha kuyilumikiza chingwe kugwiritsa ntchito chinthu chonga strace -o /tmp/trace -p 20629. Mukasintha ntchito ya cron mu terminal ina, mudzalandira zotuluka ndi cholakwika. Ndipo zotsatira zake ndi izi:

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

(Chomaliza Landirani () sichidzatha potsatira.) Apanso, mwatsoka, chotsatirachi chilibe cholakwika chomwe tikuyang'ana. Sitiwona mauthenga aliwonse omwe bcrontag amatumiza kapena kulandira kuchokera ku socket. M'malo mwake, konzani ndondomeko yomaliza (choyerekeza, dikira4, SIGCHLD etc.) Izi zimabala ndondomeko ya mwana, yomwe, monga momwe mungaganizire, imagwira ntchito yeniyeni. Ndipo ngati mukufuna kumutsatira, onjezani kuyimba mzere -f. Izi ndi zomwe tidzapeza tikafufuza zolakwika muzotsatira zatsopano ndi 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 +++

Tsopano, icho ndi chinachake. Process 21470 imalandira cholakwika "chokanidwa" poyesa kupanga fayilo panjira tmp/spool.21470.1573692319.854640 (zokhudzana ndi chikwatu chomwe chikugwira ntchito pano). Tikadangodziwa bukhuli lomwe likugwira ntchito pano, tikanadziwanso njira yonse ndikutha kudziwa chifukwa chake ndondomekoyi siingathe kupanga fayilo yake yosakhalitsa mmenemo. Tsoka ilo, ndondomekoyi yatuluka kale, kotero simungagwiritse ntchito Chithunzi cha 21470 kuti mupeze chikwatu chomwe chilipo, koma mutha kugwira ntchito ina - yang'anani ma foni a PID 21470 omwe amasintha chikwatu. (Ngati palibe, PID 21470 iyenera kuti idawatengera kwa makolo ake, ndipo izi zadutsa kale. lsf -p sangadziwike.) Kuyitana kwadongosolo ili chdi (zomwe ndizosavuta kuzipeza mothandizidwa ndi makina amakono osakira pa intaneti). Ndipo nazi zotsatira zakusaka mobwerezabwereza kutengera zotsatira, mpaka pa seva 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 +++

(Ngati mwatayika, mungafune kuwerenga zomwe ndalemba kale za *nix process management ndi zipolopolo.) Kotero, seva PID 20629 sanalandire chilolezo chopanga fayilo panjira /var/spool/cron/tmp/spool.21470.1573692319.854640. Mwachidziwikire, chifukwa cha izi ndi zosintha zachilolezo zamafayilo apamwamba. Tiyeni tiwone:

# 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

Kumeneko ndi kumene anakwiriridwa galuyo! Seva imayenda ngati cron wogwiritsa ntchito, koma muzu wokha uli ndi chilolezo cholembera ku bukhuli /var/spool/cron/tmp/. Lamulo losavuta chown cron /var/spool/cron/tmp/ adzakakamiza bcron gwirani ntchito moyenera. (Ngati silinali vuto, ndiye kuti wokayikira wotsatirayo ndi gawo lachitetezo cha kernel ngati SELinux kapena AppArmor, ndiye ndikadayang'ana chipika cha uthenga wa kernel ndi dmesg.)

Chiwerengero

Kutsata kuyimba kwadongosolo kumatha kukhala kochulukira kwa omwe angoyamba kumene, koma ndikhulupilira ndawonetsa kuti ndi njira yachangu yothetsera kalasi yonse yamavuto omwe amatumizidwa. Ingoganizirani kuyesa kukonza zolakwika zambiri bcronpogwiritsa ntchito debugger pang'onopang'ono.

Kuyang'ana zotsatira zotsatizana m'mayimbidwe amachitidwe kumafuna luso, koma monga ndidanenera, pafupifupi nthawi zonse, kugwiritsa ntchito chingwe, ndimangopeza zotsatira ndikuyang'ana zolakwika kuyambira kumapeto. Komabe, chingwe zimandithandiza kusunga nthawi yochuluka pakuchotsa zolakwika. Ndikukhulupirira kuti zikhala zothandiza kwa inunso.

Source: www.habr.com

Kuwonjezera ndemanga