Pag-debug sa software deployment nga adunay strace

Pag-debug sa software deployment nga adunay strace

Ang akong adlaw nga trabaho kasagaran nga pag-deploy sa software, nga nagpasabut nga naggugol ako og daghang oras sa pagsulay sa pagtubag sa mga pangutana sama sa:

  • Kini nga software nagtrabaho alang sa developer, apan dili alang kanako. Ngano man?
  • Kagahapon kini nga software nagtrabaho alang kanako, apan karon dili. Ngano man?

Kini usa ka matang sa pag-debug nga medyo lahi sa regular nga pag-debug sa software. Ang regular nga pag-debug kay mahitungod sa lohika sa code, apan ang deployment debugging kay mahitungod sa interaksyon tali sa code ug sa palibot. Bisan kung ang gamut sa problema usa ka lohikal nga sayup, ang kamatuoran nga ang tanan nagtrabaho sa usa ka makina ug dili sa lain nagpasabut nga ang problema sa usa ka paagi sa palibot.

Mao nga imbis sa naandan nga mga gamit sa pag-debug sama sa gdb Naa koy lahi nga set sa mga himan para sa pag-debug sa deployment. Ug ang akong paborito nga himan alang sa pag-atubang sa problema sama sa "Ngano nga kini nga software dili molihok alang kanako?" gitawag subay.

Unsa ang strace?

subay kay usa ka himan para sa β€œsystem call tracing”. Kini orihinal nga gimugna alang sa Linux, apan ang parehas nga pag-debug nga mga limbong mahimong buhaton sa mga himan alang sa ubang mga sistema (DTrace o ktrace).

Ang sukaranan nga aplikasyon yano ra kaayo. Kinahanglan ra nimo nga modagan ang strace sa bisan unsang mando ug ihulog niini ang tanan nga mga tawag sa sistema (bisan kung kinahanglan nimo una nga i-install kini sa imong kaugalingon. subay):

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

Unsa kini nga mga tawag sa sistema? Kini sama sa usa ka API alang sa operating system kernel. Kaniadto, ang software adunay direktang pag-access sa hardware nga gipadagan niini. Kung, pananglitan, kinahanglan nga ipakita ang usa ka butang sa screen, nagdula kini sa mga pantalan o mga rehistro nga gi-mapa sa memorya alang sa mga aparato sa video. Sa diha nga ang multitasking nga mga sistema sa kompyuter nahimong popular, ang kagubot naghari samtang ang lainlaing mga aplikasyon nakig-away sa hardware. Ang mga kasaypanan sa usa ka aplikasyon mahimong makapaubos sa uban, kung dili ang tibuuk nga sistema. Dayon ang mga privilege mode (o β€œring protection”) nagpakita sa CPU. Ang kernel nahimong pinakapribilehiyo: nakadawat kini og bug-os nga pag-access sa hardware, nga nagpatunghag dili kaayo pribilihiyo nga mga aplikasyon nga kinahanglan nang mohangyo og access gikan sa kernel aron makig-uban sa hardware pinaagi sa mga tawag sa sistema.

Sa binary nga lebel, ang usa ka sistema nga tawag gamay nga lahi sa usa ka yano nga tawag sa function, apan kadaghanan sa mga programa naggamit usa ka wrapper sa standard nga librarya. Mga. ang POSIX C standard library adunay usa ka function call isulat (), nga naglangkob sa tanang code nga espesipiko sa arkitektura para sa tawag sa sistema isulat.

Pag-debug sa software deployment nga adunay strace

Sa laktud, ang bisan unsang interaksyon tali sa usa ka aplikasyon ug sa palibot niini (mga sistema sa kompyuter) gihimo pinaagi sa mga tawag sa sistema. Busa, kung ang software molihok sa usa ka makina apan dili sa lain, maayo nga tan-awon ang mga resulta sa pagsubay sa tawag sa sistema. Labaw nga espesipiko, ania ang usa ka lista sa kasagaran nga mga punto nga mahimong analisahon gamit ang usa ka pagsubay sa tawag sa sistema:

  • Console I/O
  • Network I/O
  • Pag-access sa sistema sa file ug file I/O
  • Pagdumala sa tibuok kinabuhi sa usa ka proseso nga hilo
  • Ubos nga lebel sa pagdumala sa memorya
  • Pag-access sa piho nga mga driver sa aparato

Kanus-a gamiton ang strace?

Sa teoriya, subay gigamit sa bisan unsang programa sa wanang sa tiggamit, tungod kay ang bisan unsang programa sa wanang sa tiggamit kinahanglan maghimo mga tawag sa sistema. Kini molihok nga mas episyente sa gihugpong, ubos nga lebel nga mga programa, apan kini usab nagtrabaho uban sa taas nga lebel nga mga pinulongan sama sa Python kung mahimo nimong maputol ang dugang nga kasaba gikan sa runtime ug interpreter.

Sa tanang himaya niini subay nagpakita sa iyang kaugalingon sa panahon sa pag-debug sa software nga nagtrabaho og maayo sa usa ka makina, apan kalit nga mihunong sa pagtrabaho sa lain, nga nagpatunghag dili klaro nga mga mensahe mahitungod sa mga file, mga permiso, o dili malampuson nga mga pagsulay sa pagpatuman sa pipila ka mga sugo o sa uban pa... Sayang, apan dili. maayo kaayo nga kombinasyon sa mga problema sa taas nga lebel sama sa mga sayup sa pag-verify sa sertipiko. Kasagaran kini nagkinahanglan og kombinasyon subayusahay pagsubay ug mas taas nga lebel nga mga himan (sama sa command line tool openssl sa pag-debug sa sertipiko).

Magagamit kami usa ka standalone nga server ingon usa ka pananglitan, apan ang pagsubay sa tawag sa sistema sagad mahimo sa labi ka komplikado nga mga platform sa pag-deploy. Kinahanglan lang nimo nga pilion ang husto nga mga himan.

Simple nga pananglitan sa pag-debug

Ingnon ta nga gusto nimong ipadagan ang katingad-an nga aplikasyon sa server foo, ug kini ang imong matapos:

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

Dayag nga dili kini makit-an ang configuration file nga imong gisulat. Nahitabo kini tungod kay usahay kung ang mga managers sa package nag-compile sa usa ka aplikasyon, ilang gi-override ang gipaabut nga mga lokasyon sa file. Ug kung sundon nimo ang giya sa pag-install alang sa usa ka pag-apod-apod, sa lain makit-an nimo ang mga file nga hingpit nga lahi sa imong gipaabut. Ang problema mahimong masulbad sa pipila ka mga segundo kung ang mensahe sa sayup nagsulti kung asa pangitaon ang configuration file, apan dili. Busa asa mangita?

Kung adunay ka access sa source code, mahimo nimo kining basahon ug mahibal-an ang tanan. Usa ka maayo nga backup nga plano, apan dili ang labing paspas nga solusyon. Mahimo nimong gamiton ang usa ka lakang-sa-lakang nga debugger sama gdb ug tan-awa kung unsa ang gibuhat sa programa, apan mas epektibo ang paggamit sa usa ka himan nga espesipikong gidisenyo aron ipakita ang interaksyon sa palibot: subay.

konklusyon subay morag kabus, apan ang maayong balita mao nga kadaghanan niini mahimong luwas nga mabalewala. Kanunay nga mapuslanon ang paggamit sa -o operator aron i-save ang mga resulta sa pagsubay sa usa ka lahi nga file:

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

Gibana-bana ang tibuok unang panid sa output subay - Kini kasagaran ubos nga lebel nga pagpangandam alang sa paglansad. (Daghang tawag mmap, mproteksyon, quill alang sa mga butang sama sa pag-ila sa ubos nga lebel sa panumduman ug pagpakita sa dinamikong mga librarya.) Sa tinuud, sa panahon sa pag-debug sa output subay Mas maayo nga magbasa gikan sa katapusan. Adunay usa ka hagit sa ubos isulat, nga nagpakita sa mensahe sa sayop. Atong tan-awon sa ibabaw ug makita ang unang sayop nga tawag sa sistema - ang tawag openat, nga naghulog sa usa ka sayup ENOENT ("file o direktoryo wala makita") naningkamot sa pag-abli /etc/foo/config.json. Dinhi kinahanglan ang configuration file.

Kini usa lamang ka pananglitan, apan akong isulti 90% sa oras nga akong gigamit subay, wala nay mas lisod buhaton kay niini. Sa ubos mao ang usa ka kompleto nga lakang-sa-lakang nga giya sa pag-debug:

  • Nasuko tungod sa usa ka dili klaro nga mensahe bahin sa usa ka system-y error gikan sa usa ka programa
  • I-restart ang programa gamit ang subay
  • Pangitaa ang mensahe sa sayup sa mga resulta sa pagsubay
  • Lakaw nga mas taas hangtod naigo nimo ang una nga napakyas nga tawag sa sistema

Lagmit kaayo nga ang tawag sa sistema sa lakang 4 magpadayag kung unsa ang sayup.

Mga pahibalo

Sa dili pa ipakita kanimo ang usa ka pananglitan sa mas komplikado nga pag-debug, ipakita ko kanimo ang pipila ka mga limbong alang sa epektibo nga paggamit subay:

ang tawo imong higala

Sa daghang *nix system, ang usa ka kompleto nga lista sa mga tawag sa sistema sa kernel mahimong makuha pinaagi sa pagdagan tawo syscalls. Makita nimo ang mga butang sama sa brk(2), nga nagpasabot nga mas daghang impormasyon ang makuha pinaagi sa pagdagan tawo 2 brk.

Gamay nga rake: tawo 2 tinidor gipakita kanako ang panid alang sa kabhang tinidor () Π² GNU libc, nga, kini nahimo, gipatuman pinaagi sa pagtawag clone(). Pagtawag sa mga semantika Tinidor nagpabilin nga pareho kung nagsulat ka usa ka programa gamit tinidor (), ug pagdagan og usa ka pagsubay - Wala koy makit-an nga mga tawag Tinidor, imbes kanila adunay clone(). Ang ingon nga mga rake makapalibog kanimo kung magsugod ka sa pagtandi sa gigikanan sa output subay.

Gamita ang -o aron i-save ang output sa usa ka file

subay makamugna ug halapad nga output, mao nga kasagaran mapuslanon ang pagtipig sa mga resulta sa pagsubay sa lain nga mga file (sama sa pananglitan sa ibabaw). Makatabang usab kini aron malikayan ang makalibog nga output sa programa sa output subay sa console.

Gamita ang -s aron makita ang dugang nga datos sa argumento

Mahimo nimong namatikdan nga ang ikaduha nga katunga sa mensahe sa sayup wala gipakita sa panig-ingnan nga pagsubay sa ibabaw. Tungod kay subay Ang default nagpakita lamang sa unang 32 ka bytes sa string argument. Kung gusto nimo makakita og dugang, idugang ang usa ka butang sama sa -s 128 sa tawag subay.

-y nagpadali sa pagsubay sa mga file, socket, ug uban pa.

Ang "All is file" nagpasabot nga ang *nix systems mobuhat sa tanang I/O gamit ang file descriptors, mapadapat man kana sa file o network o interprocess pipes. Kombenyente kini alang sa pagprograma, apan nagpalisud sa pagsubay sa kung unsa gyud ang nahitabo kung makita nimo nga komon basaha ΠΈ isulat sa mga resulta sa pagsubay sa tawag sa sistema.

Pinaagi sa pagdugang sa usa ka operator -Ρƒ, pugson nimo subay i-annotate ang matag file descriptor sa output nga adunay nota kung unsa ang gipunting niini.

Ilakip sa nagdagan na nga proseso gamit ang -p**

Sama sa imong makita gikan sa panig-ingnan sa ubos, usahay kinahanglan nimo nga masubay ang usa ka programa nga nagdagan na. Kung nahibal-an nga kini nagdagan ingon proseso 1337 (ingon, gikan sa output ps), unya masubay nimo kini sama niini:

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

Tingali kinahanglan nimo ang mga katungod sa gamut.

Paggamit -f sa pagmonitor sa mga proseso sa bata

subay Sa kasagaran, kini nagsubay lamang sa usa ka proseso. Kung kini nga proseso nagpatunghag mga proseso sa bata, nan ang tawag sa sistema sa pagpanganak sa proseso sa bata makita, apan ang mga tawag sa sistema sa proseso sa bata dili ipakita.

Kung sa imong hunahuna ang sayup naa sa proseso sa bata, gamita ang pahayag -f, kini makahimo sa pagsubay niini. Ang downside niini mao nga ang output makapalibog kanimo labaw pa. Kanus-a subay nagsubay sa usa ka proseso o usa ka hilo, kini nagpakita sa usa ka sapa sa mga panghitabo sa tawag. Kung kini nagsubay sa daghang mga proseso sa usa ka higayon, mahimo nimong makita ang pagsugod sa usa ka tawag nga nabalda sa usa ka mensahe , unya - usa ka hugpong sa mga tawag alang sa ubang mga sanga sa pagpatay, ug unya - ang katapusan sa una <...foocall gipadayon>. O bahina ang tanan nga mga resulta sa pagsubay sa lainlaing mga file, gamit usab ang operator -ff (mga detalye sa pagpangulo sa subay).

Pagsala sa mga pagsubay gamit ang -e

Sama sa imong nakita, ang resulta sa pagsubay usa ka tinuud nga pundok sa tanan nga posible nga mga tawag sa sistema. Bandila -e Mahimo nimong i-filter ang pagsubay (tan-awa giya sa subay). Ang nag-unang bentaha mao nga kini mao ang mas paspas sa pagdagan sa usa ka sinala pagsubay kay sa pagbuhat sa usa ka bug-os nga pagsubay ug unya grep`sa. Sa tinuod lang, halos wala koy labot.

Dili tanang sayop daotan

Ang usa ka yano ug kasagaran nga pananglitan mao ang usa ka programa nga nangita alang sa usa ka file sa daghang mga lugar sa usa ka higayon, sama sa usa ka kabhang nga nangita alang sa usa ka direktoryo nga adunay usa ka executable file:

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

Ang heuristics sama sa "katapusang napakyas nga hangyo sa wala pa magreport sa usa ka sayup" maayo sa pagpangita sa mga may kalabutan nga sayup. Bisan unsa pa, makatarunganon nga magsugod gikan sa katapusan.

Ang mga tutorial sa C programming makatabang nimo nga masabtan ang mga tawag sa sistema.

Ang mga standard nga tawag sa mga librarya sa C dili mga tawag sa sistema, apan usa lamang ka nipis nga layer sa nawong. Busa, kung nakasabut ka bisan gamay kung giunsa ug kung unsa ang buhaton sa C, mas dali nimo masabtan ang mga sangputanan sa pagsubay sa tawag sa sistema. Pananglitan, adunay ka problema sa pag-debug sa mga tawag sa mga sistema sa network, tan-awa ang parehas nga klasiko Giya ni Bija sa Network Programming.

Usa ka mas komplikado nga pananglitan sa pag-debug

Gisulti na nako nga ang panig-ingnan sa yano nga pag-debug usa ka pananglitan sa kung unsa ang kasagaran nga kinahanglan nakong atubangon kung magtrabaho subay. Apan, usahay gikinahanglan ang tinuod nga imbestigasyon, mao nga ania ang tinuod nga kinabuhi nga pananglitan sa mas abante nga pag-debug.

bcron - task processing scheduler, laing pagpatuman sa *nix daemon cron. Gi-install kini sa server, apan kung adunay mosulay sa pag-edit sa iskedyul, kini ang mahitabo:

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

Okay, nagpasabot kana bcron misulay sa pagsulat sa usa ka piho nga file, apan kini wala molampos, ug siya dili moangkon ngano. Pagbutyag subay:

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

Adunay usa ka mensahe sa sayup nga hapit sa katapusan isulat, apan niining higayona adunay lahi. Una, wala'y kalabutan nga sistema sa tawag nga sayup, nga kasagaran mahitabo sa wala pa kini. Ikaduha, klaro nga sa usa ka lugar adunay nakabasa na sa mensahe sa sayup. Morag ang tinuod nga problema anaa sa laing dapit, ug bcontab i-play lang balik ang mensahe.

Kung tan-awon nimo lalaki 2 nagbasa, imong makita nga ang unang argumento (3) kay file descriptor, nga *nix naggamit sa tanang I/O processing. Giunsa nako mahibal-an kung unsa ang girepresentar sa file descriptor 3? Niini nga partikular nga kaso, mahimo ka nga modagan subay uban sa operator -Ρƒ (tan-awa sa ibabaw) ug kini awtomatik nga isulti kanimo, apan aron mahibal-an ang mga butang nga sama niini, mapuslanon nga mahibal-an kung unsaon pagbasa ug pag-parse sa mga resulta sa pagsubay.

Ang tinubdan sa usa ka file descriptor mahimo nga usa sa daghang mga tawag sa sistema (kini tanan nagdepende sa kung unsa ang deskriptor para - usa ka console, usa ka network socket, usa ka file mismo, o uban pa), apan bisan pa, kita mangita alang sa mga tawag pinaagi sa pagbalik sa 3 (i.e. .e. pangitaon nato ang β€œ= 3” sa mga resulta sa pagsubay). Niini nga resulta adunay 2 niini: openat sa pinakataas ug sungkit Sa tunga-tunga. openat ablihan ang file apan suod nga(3) unya ipakita nga kini magsira pag-usab. (Rake: ang mga deskriptor sa file mahimong magamit pag-usab kung kini giablihan ug gisira). Tawag socket() angayan tungod kay kini ang katapusan sa una basaha (), ug kini nahimo nga ang bcontab nagtrabaho sa usa ka butang pinaagi sa usa ka socket. Ang sunod nga linya nagpakita nga ang file descriptor nalangkit sa unix domain socket padulong na /var/run/bcron-spool.

Busa, kinahanglan natong pangitaon ang proseso nga nalangkit unix socket sa pikas bahin. Adunay usa ka pares nga hapsay nga mga limbong alang niini nga katuyoan, nga pareho nga mapuslanon alang sa pag-debug sa mga pag-deploy sa server. Ang una mao ang paggamit netstat o mas bag-o ss (status sa socket). Ang duha ka mga sugo nagpakita sa aktibong mga koneksyon sa network sa sistema ug gikuha ang pahayag -l aron ihulagway ang mga socket sa pagpaminaw, ingon man ang operator -p aron ipakita ang mga programa nga konektado sa socket isip kliyente. (Adunay daghang mas mapuslanon nga mga kapilian, apan kining duha igo na alang niini nga buluhaton.)

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

Kini nagsugyot nga ang tigpaminaw mao ang sugo inixserver, nga nagdagan sa proseso nga ID 20629. (Ug, sulagma, kini naggamit sa file descriptor 3 isip socket.)

Ang ikaduha nga mapuslanon nga himan alang sa pagpangita sa parehas nga kasayuran gitawag lsof. Gilista niini ang tanang bukas nga mga file (o mga deskriptor sa file) sa sistema. O makakuha ka og impormasyon bahin sa usa ka piho nga file:

# 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

Ang Proseso 20629 kay usa ka long-lived nga server, para ma-attach nimo kini subay gamit ang usa ka butang sama sa strace -o /tmp/trace -p 20629. Kung mag-edit ka sa usa ka cron nga trabaho sa lain nga terminal, makadawat ka usa ka pagsubay nga output nga adunay sayup. Ug ania ang resulta:

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

(Katapusan dawata () dili makompleto kung gisubay.) Usab, sa walay palad, kini nga resulta wala maglangkob sa sayup nga among gipangita. Wala miy makita nga mga mensahe nga gipadala o nadawat sa bcontag gikan sa socket. Hinunoa, kompleto nga pagkontrol sa proseso (clone, paghulat4, SIGCHLD ug uban pa) Kini nga proseso nagpatunghag proseso sa bata, nga, ingon sa imong pagtag-an, ang tinuod nga trabaho. Ug kung kinahanglan nimo nga makuha ang iyang agianan, idugang sa tawag laray -f. Kini ang atong makit-an kung atong pangitaon ang mensahe sa sayup sa bag-ong resulta nga adunay 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 +++

Karon, usa kana ka butang. Ang Proseso 21470 nakadawat og usa ka "access denied" nga sayup sa pagsulay sa paghimo og file sa dalan tmp/spool.21470.1573692319.854640 (nga may kalabutan sa kasamtangan nga direktoryo sa pagtrabaho). Kung nahibal-an lang naton ang karon nga direktoryo sa pagtrabaho, mahibal-an usab naton ang tibuuk nga agianan ug mahibal-an kung ngano nga ang proseso dili makahimo sa temporaryo nga file niini. Ikasubo, ang proseso migawas na, mao nga dili nimo magamit lsof -p 21470 aron makit-an ang kasamtangan nga direktoryo, apan mahimo ka nga magtrabaho sa atbang nga direksyon - pangitaa ang PID 21470 nga mga tawag sa sistema nga nagbag-o sa direktoryo. (Kung wala, ang PID 21470 kinahanglan nga nakapanunod kanila gikan sa ginikanan niini, ug kini pinaagi na sa lsof -p dili mahibal-an.) Kini nga tawag sa sistema mao ang chdir (nga sayon ​​​​nga mahibal-an sa tabang sa modernong online nga mga search engine). Ug ania ang resulta sa reverse searches base sa mga resulta sa pagsubay, hangtod sa server 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 +++

(Kung nawala ka, mahimo nimong basahon ang akong miaging post mahitungod sa *nix nga pagdumala sa proseso ug mga kabhang.) Busa, ang server PID 20629 wala makadawat pagtugot sa paghimo sa usa ka file sa dalan /var/spool/cron/tmp/spool.21470.1573692319.854640. Lagmit, ang hinungdan niini mao ang klasiko nga mga setting sa pagtugot sa file system. Atong susihon:

# 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

Didto gilubong ang iro! Ang server nagdagan isip usa ka user cron, apan ang gamut lamang ang adunay pagtugot sa pagsulat sa direktoryo /var/spool/cron/tmp/. Simple nga sugo chown cron /var/spool/cron/tmp/ mupugos bcron pagtrabaho sa husto. (Kung dili kana ang problema, nan ang sunod nga labing lagmit nga suspetsado mao ang usa ka module sa seguridad sa kernel sama sa SELinux o AppArmor, mao nga susihon nako ang log sa mensahe sa kernel gamit ang dmesg.)

Total

Ang mga pagsubay sa tawag sa sistema mahimong mabug-at alang sa usa ka bag-ohan, apan nanghinaut ko nga akong gipakita nga kini usa ka dali nga paagi aron ma-debug ang usa ka tibuuk nga klase sa kasagarang mga problema sa pag-deploy. Hunahunaa ang pagsulay sa pag-debug sa usa ka multiprocess bcrongamit ang step-by-step debugger.

Ang pag-parse sa pagsubay sa mga resulta pabalik sa kadena sa tawag sa sistema nanginahanglan kahanas, apan sama sa akong giingon, hapit kanunay, gamit subay, Nakuha ra nako ang resulta sa pagsubay ug pangitaon ang mga sayup sugod sa katapusan. Bisan pa, subay nakatabang kanako nga makadaginot ug daghang oras sa pag-debug. Nanghinaut ko nga kini mapuslanon usab kanimo.

Source: www.habr.com

Idugang sa usa ka comment