Debugging software deployment with strace

Debugging software deployment with strace

Ny asako isan'andro dia ny fametrahana rindrambaiko amin'ny ankapobeny, izay midika fa mandany fotoana betsaka aho hamaliana fanontaniana toy ny:

  • Ity rindrambaiko ity dia miasa ho an'ny mpamorona, fa tsy ho ahy. Nahoana?
  • Omaly dia niasa tamiko ity rindrambaiko ity, saingy tsy mandeha izany ankehitriny. Nahoana?

Ity dia karazana debugging izay tsy mitovy amin'ny debugging rindrambaiko mahazatra. Ny debugging tsy tapaka dia momba ny lojikan'ny kaody, fa ny debugging ny fametrahana dia momba ny fifandraisana misy eo amin'ny code sy ny tontolo iainana. Na dia fahadisoana lojika aza no fototry ny olana, ny hoe miasa amin'ny milina iray ny zava-drehetra fa tsy amin'ny hafa dia midika fa ny olana dia eo amin'ny tontolo iainana.

Noho izany fa tsy ny mahazatra debugging fitaovana toy ny gdb Manana fitaovana hafa aho amin'ny fametrahana debugging. Ary ny fitaovana tiako indrindra amin'ny fiatrehana ny olana toy ny "Nahoana no tsy miasa amiko ity rindrambaiko ity?" ANTSOINA strace.

Inona no atao hoe strace?

strace dia fitaovana ho an'ny "system call tracing". Izy io dia noforonina ho an'ny Linux tany am-boalohany, fa ireo tricks debugging mitovy dia azo atao amin'ny fitaovana ho an'ny rafitra hafa (DTrace na ktrace).

Ny fampiharana fototra dia tena tsotra. Mila manao strace fotsiny ianao miaraka amin'ny baiko rehetra ary hanary ny antso rehetra amin'ny rafitra (na dia mety tsy maintsy mametraka azy ianao aloha) 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 +++

Inona avy ireo antso an-tariby ireo? Ity dia zavatra toy ny API ho an'ny kernel rafitra miasa. Indray mandeha, ny logiciel dia nanana fidirana mivantana tamin'ny hardware izay nandehanany. Raha toa, ohatra, dia nila nampiseho zavatra teo amin'ny efijery izy, dia nilalao tamin'ny seranana na rejisitra misy sarintany ho an'ny fitaovana video. Rehefa lasa malaza ny rafitra informatika maro, dia nanjaka ny korontana satria niady tamin'ny fitaovana ny fampiharana isan-karazany. Ny hadisoana amin'ny fampiharana iray dia mety hampidina ny hafa, raha tsy ny rafitra manontolo. Avy eo dia niseho tao amin'ny CPU ny maody tombontsoa (na "fiarovana peratra"). Ny kernel dia nanjary nahazo tombontsoa indrindra: nahazo fidirana feno amin'ny fitaovana izy, niteraka rindranasa tsy dia nahazo tombontsoa izay efa nangataka fidirana tamin'ny kernel mba hifaneraserana amin'ny fitaovana amin'ny alàlan'ny antso an-tariby.

Amin'ny ambaratonga binary, ny antso an-tariby dia hafa kely amin'ny antso tsotra, fa ny ankamaroan'ny programa dia mampiasa fonosana ao amin'ny tranomboky mahazatra. Ireo. ny tranomboky mahazatra POSIX C dia misy antso an-tariby manoratra (), izay ahitana ny kaody manokana momba ny maritrano ho an'ny antson'ny rafitra manoratra.

Debugging software deployment with strace

Raha fintinina, ny fifandraisana rehetra eo amin'ny fampiharana sy ny tontolo iainany (rafitra informatika) dia atao amin'ny alàlan'ny antso an-tariby. Noho izany, rehefa miasa amin'ny milina iray ny rindrambaiko fa tsy amin'ny hafa, dia tsara ny mijery ny valin'ny fanaraha-maso antso an-tariby. Amin'ny ankapobeny, ity misy lisitr'ireo teboka mahazatra azo alaina amin'ny alàlan'ny trace antso an-tariby:

  • Console I/O
  • Tambajotra I/O
  • Fidirana amin'ny rafitra fisie sy rakitra I/O
  • Mitantana ny androm-piainan'ny kofehy iray
  • Fitantanana fahatsiarovana ambany
  • Fidirana amin'ny mpamily fitaovana manokana

Rahoviana ny fampiasana strace?

Amin'ny teoria, strace ampiasaina amin'ny programa rehetra ao amin'ny habaka mpampiasa, satria ny programa rehetra ao amin'ny habaka mpampiasa dia tsy maintsy manao antso an-tariby. Miasa mahomby kokoa amin'ny programa avo lenta izy io, fa miasa amin'ny fiteny avo lenta toa an'i Python koa raha azonao atao ny manapaka ny tabataba fanampiny avy amin'ny runtime sy ny mpandika teny.

Amin'ny voninahiny rehetra strace dia miseho mandritra ny debug ny logiciel izay miasa tsara amin'ny milina iray, saingy mijanona tampoka amin'ny hafa, mamoaka hafatra manjavozavo momba ny rakitra, ny fahazoan-dàlana, na ny fikasana tsy nahomby amin'ny fanatanterahana baiko sasany na zavatra hafa ... Mampalahelo fa tsy mitambatra tsara amin'ny olana avo lenta toy ny fahadisoana fanamarinana fanamarinana. Matetika izany dia mitaky fitambarana straceindraindray ltrace ary fitaovana avo lenta kokoa (toy ny fitaovana andalana baiko openssl hanaisotra ny taratasy fanamarinana).

Hampiasa mpizara tokana izahay ho ohatra, fa ny fanarahana antso an-tariby matetika dia azo atao amin'ny sehatra fametrahana sarotra kokoa. Mila misafidy ny fitaovana mety ianao.

Ohatra debugging tsotra

Andeha atao hoe te-hampiasa ny fampiharana mpizara mahagaga foo ianao, ary izao no hiafaranao:

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

Toa tsy hitany ilay fichier configuration nosoratanao. Mitranga izany satria indraindray rehefa manangona rindranasa iray ny mpitantana ny fonosana dia manafoana ny toerana misy ny rakitra andrasana. Ary raha manaraka ny torolàlana fametrahana ho an'ny fizarana iray ianao, amin'ny iray hafa dia mahita rakitra hafa tanteraka amin'ny toerana nantenainao ianao. Ny olana dia mety ho voavaha ao anatin'ny segondra vitsy raha ny hafatra diso dia milaza ny toerana hitadiavana ny fisie fanamafisana, saingy tsy izany. Ka aiza no hijerena?

Raha afaka miditra amin'ny kaody loharano ianao dia afaka mamaky azy io ary mahita ny zava-drehetra. Drafitra backup tsara, fa tsy vahaolana haingana indrindra. Azonao atao ny mampiasa debugger tsikelikely toy ny gdb ary jereo izay ataon'ny programa, fa mahomby kokoa ny mampiasa fitaovana iray natao manokana hanehoana fifandraisana amin'ny tontolo iainana: strace.

famaranana strace Mety ho toa tafahoatra, fa ny vaovao tsara dia ny ankamaroany dia azo tsinontsinoavina. Tena ilaina ny mampiasa ny -o operator mba hitahiry ny valin'ny trace amin'ny rakitra iray:

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

Manodidina ny pejy voalohany manontolo amin'ny vokatra strace - Fiomanana ambany indrindra amin'ny fandefasana izany matetika. (Betsaka ny antso mmap, mprotect, quill ho an'ny zavatra toy ny fitadiavana fahatsiarovana ambany sy ny fampisehoana tranomboky mavitrika.) Raha ny marina, mandritra ny debugging ny vokatra strace Aleo mamaky hatramin'ny farany. Hisy fanamby etsy ambany manoratra, izay mampiseho hafatra diso. Mijery etsy ambony isika ary mahita ny antson'ny rafitra diso voalohany - ny antso openat, izay miteraka hadisoana ENOENT (“rakitra na lahatahiry tsy hita”) miezaka manokatra /etc/foo/config.json. Eto no tokony hisy ny fichier configuration.

Ohatra fotsiny izany, fa ny 90% amin'ny fotoana ampiasako dia lazaiko strace, tsy misy zavatra sarotra kokoa atao noho izany. Ity ambany ity ny torolalana momba ny debugging dingana:

  • Tezitra noho ny hafatra manjavozavo momba ny fahadisoana system-y avy amin'ny programa
  • Avereno indray ny programa amin'ny strace
  • Tadiavo ny hafatra diso ao amin'ny valin'ny trace
  • Mandehana avo kokoa mandra-pahazoanao ny antson'ny rafitra tsy nahomby voalohany

Tena azo inoana fa ny antso an-tariby ao amin'ny dingana 4 dia hanambara ny tsy nety.

hamantatra izany

Alohan'ny hampisehoanao ohatra momba ny debugging sarotra kokoa, dia hasehoko anao tricks vitsivitsy ho an'ny fampiasana mahomby strace:

ny lehilahy no namanao

Amin'ny rafitra *nix maro dia azo alaina amin'ny alàlan'ny fampandehanana ny lisitry ny antso an-tariby feno amin'ny kernel man syscalls. Hahita zavatra toy izany ianao brk(2), izay midika fa misy fampahalalana bebe kokoa azo alaina amin'ny alàlan'ny mihazakazaka lehilahy 2 brk.

Fikarakarana kely: lehilahy 2 fork asehoy ahy ny pejy momba ny akorandriaka fork () в GNU libc, izay hita fa ampiharina amin'ny fiantsoana clone (). Antsoy ny semantika sotro rovitra dia tsy miova raha manoratra programa mampiasa fork (), ary manaova trace - tsy hahita antso aho sotro rovitra, ho solon'ireo clone (). Ny rakes toy izany dia manakorontana anao raha manomboka mampitaha ny loharano amin'ny vokatra ianao strace.

Ampiasao ny -o mba hitahiry ny vokatra ao anaty rakitra

strace dia afaka miteraka vokatra be dia be, noho izany dia ilaina matetika ny mitahiry ny vokatra trace amin'ny rakitra misaraka (toy ny amin'ny ohatra etsy ambony). Izany koa dia manampy amin'ny fisorohana ny fisavoritahana ny famoahana programa amin'ny vokatra strace ao amin'ny console.

Ampiasao ny -s raha hijery angona tohan-kevitra bebe kokoa

Mety ho voamarikao fa ny tapany faharoa amin'ny hafatra diso dia tsy aseho amin'ny ohatra trace etsy ambony. Satria izany strace Ny default dia tsy mampiseho afa-tsy ny 32 bytes voalohany amin'ny adihevitra string. Raha te hahita bebe kokoa ianao dia ampio zavatra toy ny -s 128 amin'ny antso strace.

-y manamora ny fanaraha-maso ny rakitra, sockets, sns.

"Ny rakitra rehetra" dia midika fa ny rafitra *nix dia manao ny I/O rehetra amin'ny alàlan'ny famaritana rakitra, na mihatra amin'ny rakitra na tambajotra na fantsona interprocess. Mety amin'ny fandaharana izany, saingy sarotra ny manara-maso ny zava-mitranga rehefa hitanao fa mahazatra vakio ny и manoratra ao amin'ny valin'ny trace antsoin'ny rafitra.

Amin'ny fampidirana opérateur Y, hanery anao strace asio annotate isaky ny fichier descriptor ao amin'ny vokatra miaraka amin'ny fanamarihana izay tondroiny.

Ampifandraiso amin'ny dingana efa mandeha miaraka amin'ny -p**

Araka ny hitanao avy amin'ny ohatra etsy ambany, indraindray mila manara-maso programa efa mandeha ianao. Raha fantatra fa mandeha ho toy ny process 1337 (lazao, avy amin'ny output ps), dia azonao atao ny mijery azy toy izao:

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

Mety mila zo fototra ianao.

Ampiasao -f hanaraha-maso ny fizotran'ny ankizy

strace Amin'ny alàlan'ny default, dia manaraka dingana iray ihany izy io. Raha miteraka fizotry ny zaza ity dingana ity, dia ho hita ny antson'ny rafitra hamoahana ny fizotry ny zaza, fa tsy hiseho ny antson'ny rafitra ataon'ny zaza.

Raha heverinao fa ao anatin'ny fizotry ny ankizy ny fahadisoana, ampiasao ilay fanambarana -f, izany dia ahafahana manara-maso azy. Ny lafy ratsiny amin'io dia vao mainka hampisavoritaka anao ny vokatra. Rahoviana strace dia manara-maso dingana iray na kofehy iray, mampiseho hetsika antso tokana. Rehefa manaraka dingana maromaro indray mandeha izy dia mety ho hitanao ny fiatombohan'ny antso tapaka noho ny hafatra , avy eo - andiana antso ho an'ny sampana famonoana hafa, ary avy eo - ny faran'ny voalohany <…naverina indray ny foocall>. Na zarao ho rakitra samy hafa ny valin'ny trace rehetra, mampiasa ny operator ihany koa -ff (andininy ao amin'ny mpitarika amin'ny strace).

Sivana ny dian amin'ny fampiasana -e

Araka ny hitanao, ny vokatry ny dian dia tena antonona ny rehetra azo atao antso rafitra. sainam-pirenena -e Azonao atao ny manivana ny dian (jereo mpitarika amin'ny strace). Ny tombony lehibe dia ny fampandehanana trace voasivana haingana kokoa noho ny fanaovana trace feno ary avy eo grep`amin'ny. Raha ny marina, saika tsy miraharaha aho.

Tsy ny fahadisoana rehetra no ratsy

Ohatra tsotra sy mahazatra ny programa mitady rakitra amin'ny toerana maromaro indray mandeha, toy ny akorandriaka mitady lahatahiry misy rakitra azo tanterahana:

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

Ny heuristics toy ny "fangatahana tsy nahomby farany talohan'ny nitaterana fahadisoana" dia tsara amin'ny fitadiavana lesoka mifandraika. Na ahoana na ahoana, dia lojika ny manomboka amin'ny farany.

Ny fampianarana fandaharana C dia afaka manampy anao hahatakatra ny antson'ny rafitra.

Ny antso mahazatra amin'ny tranomboky C dia tsy antso an-tariby, fa sosona manify fotsiny. Noho izany, raha takatrao kely ny fomba sy ny tokony hatao amin'ny C, dia ho mora kokoa aminao ny hahatakatra ny vokatry ny trace antsoin'ny rafitra. Ohatra, manana olana amin'ny debugging antso amin'ny rafitra tambajotra ianao, jereo ny kilasika mitovy Bija's Guide to Network Programming.

Ohatra debugging sarotra kokoa

Efa nilaza aho fa ny ohatra amin'ny debugging tsotra dia ohatra iray amin'ny zavatra tsy maintsy atrehiko indrindra rehefa miasa strace. Na izany aza, indraindray dia ilaina ny fanadihadiana tena izy, ka ity misy ohatra tena misy momba ny debugging mandroso kokoa.

bcon - fandaharam-potoana fanodinana asa, fampiharana hafa an'ny *nix daemon cron. Napetraka ao amin'ny mpizara izany, fa rehefa misy manandrana manitsy ny fandaharam-potoana dia izao no mitranga:

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

Okay, midika izany bcon nanandrana nanoratra rakitra iray, fa tsy nety, ary tsy hanaiky ny antony. mamoaka strace:

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

Misy hafatra diso eo akaikin'ny farany manoratra, fa tamin'ity indray mitoraka ity dia misy zavatra hafa. Voalohany, tsy misy hadisoana antso an-tariby mifandraika, izay matetika mitranga alohan'izany. Faharoa, mazava fa any amin'ny toerana iray dia efa nisy olona namaky ny hafatra diso. Toa any an-kafa ny tena olana, ary bcontab mamerina fotsiny ny hafatra.

Raha mijery ianao lehilahy 2 mamaky, hitanao fa ny tohan-kevitra voalohany (3) dia famaritana rakitra, izay *nix ampiasaina amin'ny fanodinana I/O rehetra. Ahoana no ahafantarako izay asehon'ny descriptor 3? Amin'ity tranga manokana ity dia afaka mihazakazaka ianao strace miaraka amin'ny opérateur Y (jereo etsy ambony) dia holazaina aminao ho azy, fa mba hamantatra ny zavatra toy izao, dia ilaina ny mahafantatra ny fomba mamaky sy mamakafaka ny vokatry ny trace.

Ny loharanon'ny famariparitana rakitra dia mety ho iray amin'ireo antso an-tariby maro (miankina amin'izay ilain'ny mpamoritra izany - console, socket tambajotra, ilay rakitra mihitsy, na zavatra hafa), fa na izany na tsy izany, dia mitady isika. miantso amin'ny fiverenana 3 (izany hoe mitady "= 3" isika amin'ny valin'ny trace). Amin'ity vokatra ity dia misy 2 amin'izy ireo: openat eo ambony indrindra ary faladiany Eo afovoany. openat manokatra ny rakitra fa akaiky(3) dia hampiseho fa mihidy indray. (Rake: azo ampiasaina indray ny famariparitana rakitra rehefa misokatra sy mihidy). ANTSO socket () mety satria io no farany teo aloha vakio (), ary hita fa ny bcontab dia miasa amin'ny zavatra iray amin'ny alàlan'ny socket. Ny andalana manaraka dia mampiseho fa misy ifandraisany amin'ny famaritana ny rakitra unix domain socket eny an-dàlana /var/run/bcron-spool.

Noho izany, mila mitady ny dingana mifandraika amin'izany isika socket unix eo ampita. Misy tetika tsara roa ho an'ity tanjona ity, izay samy mahasoa amin'ny fametrahana ny server debug. Ny voalohany dia ny fampiasana netstat na vaovao kokoa ss (toetry ny socket). Ireo baiko roa ireo dia mampiseho ny fifandraisan'ny tambajotra mavitrika amin'ny rafitra ary maka ny fanambarana -l mba hamaritana ny socket fihainoana, ary koa ny mpandraharaha -p mba hampisehoana programa mifandray amin'ny socket ho mpanjifa. (Misy safidy mahasoa maro kokoa, fa ireo roa ireo dia ampy ho an'ity asa ity.)

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

Midika izany fa ny mpihaino no baiko inixserver, mandeha miaraka amin'ny process ID 20629. (Ary, kisendrasendra, dia mampiasa ny famaritana rakitra 3 ho toy ny socket.)

Ny fitaovana faharoa tena ilaina amin'ny fitadiavana fampahalalana mitovy dia antsoina lsof. Izy io dia mitanisa ny rakitra misokatra rehetra (na mpamoritra rakitra) ao amin'ny rafitra. Na azonao atao ny mahazo fampahalalana momba ny rakitra iray manokana:

# 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 dia mpizara maharitra ela, ka azonao atao ny mampifandray azy io strace mampiasa zavatra toy izany strace -o /tmp/trace -p 20629. Raha manova asa cron amin'ny terminal hafa ianao dia hahazo vokatra trace misy hadisoana. Ary izao no vokany:

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

(Farany manaiky () tsy ho vita rehefa tracing.) Indrisy anefa fa tsy ahitana ny fahadisoana tadiavintsika ity valiny ity. Tsy mahita hafatra alefan'ny bcontag na raisina avy amin'ny socket izahay. Fa kosa, fanaraha-maso tanteraka ny dingana (Clone, miandry4, SIGCHLD sns.) Ity dingana ity dia miteraka dingan'ny ankizy, izay, araka ny mety ho eritreretinao, dia manao ny tena asa. Ary raha mila maka ny diany ianao, ampio amin'ny antso strace -f. Izany no ho hitantsika rehefa mikaroka ny hafatra diso amin'ny valiny vaovao miaraka amin'ny 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 +++

Ankehitriny, zavatra izany. Ny process 21470 dia mahazo lesoka "fidirana nolavina" rehefa manandrana mamorona rakitra amin'ny lalana tmp/spool.21470.1573692319.854640 (mifandraika amin'ny lahatahiry miasa ankehitriny). Raha fantatsika fotsiny ny lahatahiry miasa ankehitriny, dia ho fantatsika ihany koa ny lalana feno ary ho afaka hamantatra ny antony tsy ahafahan'ny dingana mamorona ny rakitra vonjimaika ao anatiny. Indrisy anefa fa efa nivoaka ny dingana, ka tsy azonao ampiasaina fotsiny lsof -p 21470 mba hahitana ny lahatahiry ankehitriny, fa afaka miasa amin'ny lalana mifanohitra - tadiavo ny PID 21470 antso rafitra izay manova ny lahatahiry. (Raha tsy misy izany dia tsy maintsy nandova azy ireo tamin'ny ray aman-dreniny ny PID 21470, ary efa vita izany lsof -p tsy fantatra.) Ity antso an-tariby ity dia chdir (izay mora fantarina amin'ny fanampian'ny milina fikarohana an-tserasera maoderina). Ary izao ny vokatry ny fikarohana mivadika mifototra amin'ny valin'ny trace, hatrany amin'ny mpizara 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 +++

(Raha very ianao dia azonao atao ny mamaky ny lahatsoratro teo aloha momba ny *nix process management and shells.) Noho izany, ny mpizara PID 20629 dia tsy nahazo alalana hamorona rakitra amin'ny lalana /var/spool/cron/tmp/spool.21470.1573692319.854640. Azo inoana fa ny anton'izany dia ny filaharan'ny fahazoan-dàlana rafitra rakitra mahazatra. Andeha hojerentsika:

# 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

Teo no nandevenana ny alika! Ny mpizara dia mandeha ho toy ny cron mpampiasa, fa ny fakany ihany no mahazo alalana hanoratra amin'ny lahatahiry /var/spool/cron/tmp/. baiko tsotra chown cron /var/spool/cron/tmp/ hanery bcon miasa tsara. (Raha tsy izany no olana, dia ny maodely fiarovana kernel toa an'i SELinux na AppArmor no mety ho ahiahiana manaraka, ka hojereko ny log message kernel miaraka amin'ny dmesg.)

Итого

Mety ho sahiran-tsaina ho an'ny vao manomboka ny dian'ny antso an-tariby, saingy manantena aho fa nasehoko fa fomba haingana hamongorana ireo olana amin'ny fametrahana mahazatra izy ireo. Alaivo sary an-tsaina ny manandrana manaisotra multiprocess bconmampiasa debugger tsikelikely.

Mitaky fahaiza-manao, araka ny nolazaiko, saika matetika, mampiasa strace, mahazo ny valin'ny trace aho ary mitady lesoka manomboka amin'ny farany. Na izany na tsy izany, strace manampy ahy hamonjy fotoana betsaka amin'ny debugging. Manantena aho fa hahasoa anao koa izany.

Source: www.habr.com

Add a comment