Debugging deployment software kalawan strace

Debugging deployment software kalawan strace

Pakasaban dinten abdi lolobana panyebaran parangkat lunak, anu hartosna kuring nyéépkeun seueur waktos nyobian ngajawab patarosan sapertos:

  • software ieu lumaku pikeun pamekar, tapi teu keur kuring. Naha?
  • Kamari parangkat lunak ieu damel pikeun kuring, tapi ayeuna henteu. Naha?

Ieu mangrupikeun jinis debugging anu rada béda ti debugging parangkat lunak biasa. debugging biasa nyaeta ngeunaan logika kode, tapi deployment debugging nyaeta ngeunaan interaksi antara kode jeung lingkungan. Malah lamun akar masalahna nyaéta kasalahan logis, kanyataan yén sagalana jalan dina hiji mesin teu on sejen hartina masalah anu kumaha bae di lingkungan.

Jadi gaganti parabot debugging dawam kawas gdb Kuring boga set béda tina parabot pikeun debugging deployment. Sareng alat karesep kuring pikeun ngatasi masalah sapertos "Naha parangkat lunak ieu henteu dianggo pikeun kuring?" disebut tali.

Naon ari strace?

tali mangrupakeun alat pikeun "sistem panggero tracing". Asalna diciptakeun pikeun Linux, tapi trik debugging anu sami tiasa dilakukeun sareng alat pikeun sistem anu sanés (DTrace atawa ktration).

Aplikasi dasarna saderhana pisan. Anjeun ngan ukur kedah ngajalankeun strace kalayan paréntah naon waé sareng éta bakal ngaleungitkeun sadaya sauran sistem (sanaos mimitina anjeun panginten kedah masang éta nyalira. tali):

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

Naon anu disebut sistem ieu? Ieu mangrupikeun API pikeun kernel sistem operasi. Sakali kana waktos, parangkat lunak ngagaduhan aksés langsung kana hardware anu dijalankeunana. Lamun, contona, eta diperlukeun pikeun nembongkeun hiji hal dina layar, éta maénkeun kalayan palabuhan atawa registers memori-dipetakeun pikeun alat video. Nalika sistem komputer multitasking janten populer, huru-hara maréntah nalika sagala rupa aplikasi berjuang pikeun hardware. Kasalahan dina hiji aplikasi tiasa nyababkeun anu sanés, upami henteu sadayana sistem. Lajeng modus hak husus (atawa "perlindungan ring") mucunghul dina CPU. Kernel janten anu paling istimewa: nampi aksés pinuh kana hardware, ngaluncurkeun aplikasi anu kirang hak istimewa anu kedah menta aksés ti kernel pikeun berinteraksi sareng hardware ngaliwatan telepon sistem.

Dina tingkat binér, panggero sistem rada béda ti panggero fungsi basajan, tapi lolobana program ngagunakeun wrapper dina perpustakaan baku. Jelema. perpustakaan baku POSIX C ngandung panggero fungsi nyerat (), nu ngandung sakabéh kode arsitéktur-spésifik pikeun panggero sistem nulis.

Debugging deployment software kalawan strace

Pondokna, naon waé interaksi antara aplikasi sareng lingkunganana (sistem komputer) dilaksanakeun ngaliwatan telepon sistem. Ku alatan éta, lamun software jalan dina hiji mesin tapi teu di mesin sejen, éta bakal hadé pikeun nempo hasil tracing panggero sistem. Leuwih husus, ieu daptar titik has nu bisa dianalisis ngagunakeun sistem panggero renik:

  • Konsol I/O
  • Jaringan I/O
  • Aksés sistem file sareng file I/O
  • Ngatur umur prosés thread
  • Manajemén mémori tingkat rendah
  • Aksés ka supir alat husus

Iraha nganggo strace?

Dina tiori, tali dipaké kalawan program naon baé dina spasi pamaké, sabab sagala program dina spasi pamaké kudu nelepon sistem. Gawéna langkung éfisién sareng program tingkat rendah anu disusun, tapi ogé tiasa dianggo sareng basa tingkat luhur sapertos Python upami anjeun tiasa ngirangan sora tambahan tina runtime sareng juru.

Dina sagala kamulyaanana tali manifests sorangan salila debugging tina software anu hade dina hiji mesin, tapi ujug-ujug eureun gawé dina sejen, ngahasilkeun pesen samar ngeunaan file, idin, atawa usaha gagal pikeun ngaéksekusi sababaraha paréntah atawa hal sejenna ... Ieu karunya, tapi teu ngagabungkeun ogé kalawan masalah tingkat luhur kayaning kasalahan verifikasi sertipikat. Biasana ieu merlukeun kombinasi talisakapeung ngalacak sareng alat tingkat anu langkung luhur (sapertos alat garis paréntah openssl pikeun debug sertipikat).

Kami bakal ngagunakeun server mandiri sabagé conto, tapi panyalusuran panggero sistem sering tiasa dilakukeun dina platform panyebaran anu langkung kompleks. Anjeun ngan kedah milih alat anu leres.

conto debugging basajan

Anggap anjeun hoyong ngajalankeun aplikasi server anu luar biasa foo, sareng ieu anu anjeun tungtungna:

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

Tétéla éta teu bisa manggihan file konfigurasi anjeun wrote. Ieu kajadian sabab kadang lamun manajer pakét nyusun hiji aplikasi, aranjeunna override lokasi file ekspektasi. Sareng upami anjeun nuturkeun pituduh pamasangan pikeun hiji distribusi, dina anu sanés anjeun mendakan file anu béda-béda ti anu anjeun ngarepkeun. Masalahna tiasa direngsekeun dina sababaraha detik upami pesen kasalahan nyarios dimana milarian file konfigurasi, tapi henteu. Janten dimana milarian?

Upami anjeun gaduh aksés kana kode sumber, anjeun tiasa maca sareng milari sadayana. Rencana cadangan anu saé, tapi sanés solusi anu paling gancang. Anjeun tiasa Resort ka step-demi-step debugger kawas gdb sareng tingali naon program éta, tapi langkung efektif ngagunakeun alat anu dirarancang khusus pikeun nunjukkeun interaksi sareng lingkungan: tali.

kacindekan tali mungkin sigana kaleuleuwihan, tapi warta alus nyaeta lolobana eta bisa aman dipaliré. Ieu sering mangpaat ngagunakeun operator -o pikeun nyimpen hasil renik kana file misah:

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

Kira-kira sakabéh halaman mimiti kaluaran tali - Ieu biasana persiapan tingkat low pikeun peluncuran. (Loba nelepon mmap, mproteksi, quill pikeun hal kawas detecting memori-tingkat lemah sareng mintonkeun perpustakaan dinamis.) Sabenerna, salila debugging kaluaran tali Éta langkung saé maca ti tungtung. Bakal aya tangtangan di handap nulis, nu mintonkeun pesen kasalahan. Urang neuteup ka luhur sarta ningali panggero sistem erroneous munggaran - panggero kabuka, nu throws kasalahan ENOENT ("file atawa diréktori teu kapanggih") nyoba muka /etc/foo/config.json. Ieu dimana file konfigurasi kedah.

Ieu ngan ukur conto, tapi kuring bakal nyarios 90% tina waktos anu kuring anggo tali, teu aya anu langkung hese tibatan ieu. Di handap ieu mangrupakeun pituduh debugging step-by-step lengkep:

  • Kesel kusabab pesen anu samar ngeunaan kasalahan sistem-y tina program
  • Balikan deui program sareng tali
  • Manggihan pesen kasalahan dina hasil renik
  • Pindah ka luhur dugi ka pencét telepon sistem gagal munggaran

Hal ieu kacida dipikaresep yén panggero sistem dina hambalan 4 bakal nembongkeun naon nu salah.

Tip

Sateuacan nunjukkeun anjeun conto debugging anu langkung kompleks, kuring bakal nunjukkeun anjeun sababaraha trik pikeun dianggo sacara efektif tali:

lalaki téh sobat anjeun

Dina seueur sistem *nix, daptar lengkep telepon sistem ka kernel tiasa didamel ku jalan lalaki syscalls. Anjeun bakal ningali hal kawas brk (2), nu hartina informasi leuwih bisa diala ku ngajalankeun lalaki 2 brk.

rake leutik: lalaki 2 garpu nembongkeun kuring kaca pikeun cangkang garpu () в GNU libc, nu, tétéla, dilaksanakeun ku nelepon klon(). Semantik nelepon garpuh tetep sarua lamun nulis program maké garpu (), sareng ngajalankeun jejak - Abdi moal mendakan telepon garpuh, tinimbang aranjeunna bakal aya klon(). Rakes sapertos ngan ngabingungkeun anjeun upami anjeun mimiti ngabandingkeun sumber sareng kaluaran tali.

Anggo -o pikeun nyimpen kaluaran kana file

tali bisa ngahasilkeun kaluaran éksténsif, jadi mindeng mangpaat pikeun nyimpen hasil renik dina file misah (sakumaha dina conto di luhur). Ieu oge mantuan pikeun nyegah kaluaran program matak ngabingungkeun jeung kaluaran tali dina konsol.

Anggo -s pikeun ningali langkung seueur data argumen

Anjeun meureun geus noticed nu satengah kadua pesen kasalahan teu ditémbongkeun dina conto renik di luhur. Éta sabab tali standar nembongkeun ukur 32 bait mimiti argumen string. Upami anjeun hoyong ningali deui, tambahkeun hal kawas -s 128 kana panggero tali.

-y ngagampangkeun pikeun ngalacak file, sockets, jsb.

"Kabéh nyaéta file" hartina * sistem nix ngalakukeun sagala I / O ngagunakeun deskriptor file, naha éta lumaku pikeun file atawa jaringan atawa pipa interprocess. Ieu merenah pikeun programming, tapi ngajadikeun hésé pikeun ngalacak naon sabenerna lumangsung lamun ningali umum maca и nulis dina hasil renik panggero sistem.

Ku nambahkeun hiji operator heuh, anjeun bakal maksa tali annotate unggal deskriptor file dina kaluaran sareng catetan naon anu ditunjuk.

Gantelkeun kana prosés anu parantos jalan sareng -p**

Sakumaha anjeun tiasa tingali tina conto di handap ieu, sakapeung anjeun kedah ngalacak program anu parantos dijalankeun. Upami dipikanyaho yén éta ngajalankeun salaku prosés 1337 (sebutkeun, tina kaluaran ps), teras anjeun tiasa ngalacak sapertos kieu:

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

Anjeun panginten peryogi hak akar.

Paké -f pikeun ngawas prosés anak

tali Sacara standar, éta ngan ukur ngalacak hiji prosés. Lamun prosés ieu spawns prosés anak, mangka panggero sistem pikeun spawn prosés anak bisa ditempo, tapi nelepon sistem anak prosés urang moal ditampilkeun.

Upami anjeun nyangka kasalahanna aya dina prosés anak, paké pernyataan éta -f, ieu bakal ngaktifkeun tracing na. The downside mun ieu nu kaluaran bakal ngalieurkeun anjeun malah leuwih. Iraha tali ngambah hiji prosés atawa hiji thread, nembongkeun aliran tunggal acara panggero. Nalika ngalacak sababaraha prosés sakaligus, anjeun tiasa ningali mimiti telepon diganggu ku pesen , teras - sakumpulan panggero pikeun cabang eksekusi anu sanés, sareng ngan ukur - tungtung anu munggaran <…foocall diteruskeun>. Atawa ngabagi sakabéh hasil ngambah kana file béda, ogé ngagunakeun operator -ff (detil dina pitunjuk on tali).

Nyaring ngambah ngagunakeun -e

Sakumaha anjeun tiasa tingali, hasil tina renik mangrupa tumpukan nyata sadaya mungkin nelepon sistem. Bandéra -e Anjeun tiasa nyaring jejak (tingali kapamimpinan on tali). Kauntungan utama nyaéta yén éta langkung gancang ngajalankeun jejak anu disaring tibatan ngalacak pinuh teras grep`di. Mun jujur, kuring ampir sok teu paduli.

Henteu sakabéh kasalahan téh goréng

Conto anu saderhana sareng umum nyaéta program milarian file dina sababaraha tempat sakaligus, sapertos cangkang milarian diréktori anu ngandung file anu tiasa dieksekusi:

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

Heuristik kawas "pamundut gagal panungtungan saméméh ngalaporkeun kasalahan" anu alus dina manggihan kasalahan relevan. Janten, éta logis pikeun ngamimitian ti tungtung.

Tutorial pemrograman C tiasa ngabantosan anjeun ngartos sauran sistem.

Sauran standar ka perpustakaan C sanés sauran sistem, tapi ngan ukur lapisan permukaan anu ipis. Janten, upami anjeun ngartos sakedik kumaha sareng naon anu kudu dilakukeun dina C, éta bakal langkung gampang pikeun anjeun ngartos hasil ngalacak sistem panggero. Contona, anjeun gaduh gangguan debugging nelepon ka sistem jaringan, tingali dina Palasik sarua Bija urang Guide to Network Programming.

Hiji conto debugging leuwih kompleks

Kuring geus ngomong yén conto debugging basajan mangrupa conto naon lolobana kuring kudu nungkulan nalika gawé bareng tali. Sanajan kitu, kadang panalungtikan nyata diperlukeun, jadi ieu conto kahirupan nyata debugging leuwih maju.

bcron - tugas processing scheduler, palaksanaan sejen tina * nix daemon Cron. Éta dipasang dina server, tapi nalika aya anu nyobian ngédit jadwalna, ieu anu kajantenan:

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

Oke, hartina bcron diusahakeun nulis file tangtu, tapi teu hasil, sarta anjeunna moal ngaku naha. Ngabongkar tali:

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

Aya pesen kasalahan caket pisan tungtung nulis, tapi waktos ieu aya anu béda. Kahiji, teu aya kasalahan panggero sistem relevan, nu biasana lumangsung saméméh ieu. Kadua, écés yén dimana waé aya anu parantos maca pesen kasalahan. Sigana mah masalah nyata tempat sejenna, jeung bcontab saukur muterkeun deui pesen.

Lamun nempo lalaki 2 maca, Anjeun bisa nempo yén argumen kahiji (3) mangrupakeun descriptor file, nu * nix ngagunakeun pikeun sakabéh I / O processing. Kumaha kuring manggihan naon file descriptor 3 ngagambarkeun? Dina hal husus ieu, anjeun tiasa ngajalankeun tali kalawan operator heuh (tingali di luhur) sareng éta bakal otomatis nyarioskeun ka anjeun, tapi pikeun terang hal-hal sapertos kieu, éta mangpaat pikeun terang kumaha maca sareng ngémutan hasil ngalacak.

Sumber deskriptor file tiasa janten salah sahiji seueur telepon sistem (éta sadayana gumantung kana naon deskriptor - konsol, stop kontak jaringan, file sorangan, atanapi anu sanés), tapi kumaha waé, urang milarian. nelepon ku mulang 3 (i.e. .e. urang néangan "= 3" dina hasil tracing). Dina hasil ieu aya 2 di antarana: kabuka di luhur pisan jeung stopkontak di tengah. kabuka muka file tapi nutup(3) lajeng bakal némbongkeun yén éta nutup deui. (Rake: deskriptor file tiasa dianggo deui nalika dibuka sareng ditutup). Nelepon stop kontak () cocog sabab éta anu terakhir sateuacan baca (), jeung tétéla yén bcontab jalan kalawan hal ngaliwatan stop kontak a. Garis salajengna nunjukkeun yén deskriptor file pakait sareng stop kontak domain unix nuju di jalan /var/run/bcron-spool.

Janten, urang kedah milarian prosés anu aya hubunganana stop kontak unix di sisi séjén. Aya sababaraha trik rapih pikeun tujuan ieu, duanana mangpaat pikeun debugging panyebaran server. Kahiji nyaeta ngagunakeun netstat atawa leuwih anyar ss (status stop kontak). Kadua paréntah nunjukkeun sambungan jaringan aktip sistem sareng nyandak pernyataan éta -l pikeun ngajelaskeun sockets dengekeun, kitu ogé operator -p pikeun mintonkeun program disambungkeun ka stop kontak salaku klien. (Aya seueur pilihan anu langkung mangpaat, tapi dua ieu cekap pikeun tugas ieu.)

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

Ieu nunjukkeun yén pangdéngé nyaéta paréntah inixserver, ngajalankeun kalawan prosés ID 20629. (Jeung, coincidentally, ngagunakeun file descriptor 3 salaku stop kontak.)

Alat kadua bener mangpaat pikeun manggihan informasi sarua disebut lsof. Éta daptar sadaya file anu kabuka (atanapi deskriptor file) dina sistem. Atanapi anjeun tiasa nampi inpormasi ngeunaan hiji file khusus:

# 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

Prosés 20629 mangrupikeun server anu umurna panjang, janten anjeun tiasa ngagantelkeunana tali ngagunakeun hal kawas strace -o /tmp/trace -p 20629. Upami anjeun ngédit padamelan cron di terminal anu sanés, anjeun bakal nampi kaluaran jejak kalayan kasalahan. Sareng ieu hasilna:

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

(Panungtungan nampi () moal réngsé nalika tracing.) Deui, hanjakalna, hasilna ieu teu ngandung kasalahan urang pilari. Kami henteu ningali pesen anu dikirimkeun atanapi ditampi ku bcontag tina stop kontak. Gantina, kontrol prosés lengkep (clone, antosan4, SIGCHLD jsb) prosés ieu spawns prosés anak, nu, anjeun bisa nebak, ngalakukeun karya nyata. Tur upami Anjeun salah kudu nyekel jalan satapak nya, tambahkeun ka nelepon jalur -f. Ieu naon urang bakal manggihan lamun urang neangan pesen kasalahan dina hasil anyar kalawan 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 +++

Ayeuna, éta hiji hal. Prosés 21470 nampi kasalahan "aksés ditolak" nalika nyobian nyiptakeun file dina jalur tmp/spool.21470.1573692319.854640 (patali jeung diréktori kerja ayeuna). Upami urang ngan terang diréktori kerja ayeuna, urang ogé bakal terang jalan lengkep sareng tiasa terang naha prosésna henteu tiasa nyiptakeun file samentawis di jerona. Hanjakalna, prosésna parantos kaluar, janten anjeun henteu tiasa ngan ukur nganggo lsof -p 21470 Dina raraga neangan diréktori ayeuna, tapi anjeun bisa dianggo dina arah nu lalawanan - néangan PID 21470 Sistim nelepon nu ngarobah diréktori. (Upami teu aya, PID 21470 kedah diwariskeun ti indungna, sareng ieu parantos ngalangkungan lsof -p teu bisa kapanggih kaluar.) Sistim panggero ieu chdir (anu gampang pikeun manggihan kalayan bantuan mesin pencari online modern). Sareng ieu mangrupikeun hasil pamilarian sabalikna dumasar kana hasil renik, dugi ka 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 +++

(Upami anjeun leungit, anjeun panginten hoyong maca tulisan kuring sateuacana ngeunaan * manajemén prosés nix jeung cangkang.) Janten, server PID 20629 henteu nampi idin pikeun nyiptakeun file dina jalur /var/spool/cron/tmp/spool.21470.1573692319.854640. Paling dipikaresep, alesan pikeun ieu nyaéta setélan idin sistem file klasik. Hayu urang parios:

# 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

Éta tempat dikubur anjing! Server dijalankeun salaku cron pangguna, tapi ngan ukur akar anu ngagaduhan idin pikeun nyerat kana diréktori /var/spool/cron/tmp/. paréntah basajan chown cron /var/spool/cron/tmp/ bakal maksa bcron dianggo leres. (Upami éta sanés masalahna, maka kasangka anu paling dipikaresep salajengna nyaéta modul kaamanan kernel sapertos SELinux atanapi AppArmor, janten kuring pariksa log pesen kernel nganggo dmesg.)

dina total

Sistem panggero ngambah tiasa overwhelming pikeun pemula, tapi kuring miharep kuring geus ditémbongkeun yén éta téh cara gancang debug sakabeh kelas masalah deployment umum. Bayangkeun nyobian debug multiprocess bcronngagunakeun debugger step-by-step.

Parsing hasil renik ka tukang sapanjang ranté Sistim panggero merlukeun skill, Tapi sakumaha ceuk kuring, ampir salawasna, ngagunakeun tali, Kuring ngan meunang hasil renik jeung néangan kasalahan mimitian ti tungtungna. Atoh, tali mantuan kuring ngahemat loba waktu dina debugging. Kuring miharep éta bakal mangpaat pikeun anjeun ogé.

sumber: www.habr.com

Tambahkeun komentar