Gyara aikin aikin software tare da madaidaici

Gyara aikin aikin software tare da madaidaici

Aikina na yau shine yawancin tura software, wanda ke nufin ina ɗaukar lokaci mai yawa don ƙoƙarin amsa tambayoyi kamar:

  • Wannan software tana aiki ga mai haɓakawa, amma ba a gare ni ba. Me yasa?
  • Jiya wannan manhaja ta yi min aiki, amma yau ba ta yi ba. Me yasa?

Wannan wani nau'in gyara ne wanda ya ɗan bambanta da gyara software na yau da kullun. Gyara na yau da kullun shine game da dabaru na lambar, amma ƙaddamar da ƙaddamarwa shine game da hulɗar tsakanin lambar da muhalli. Ko da tushen matsalar kuskure ne na ma'ana, kasancewar komai yana aiki akan na'ura ɗaya ba akan wata ba yana nufin cewa matsalar tana cikin yanayi.

Don haka a maimakon kayan aikin gyara na yau da kullun kamar gdb Ina da nau'ikan kayan aikin daban don ƙaddamar da ƙaddamarwa. Kuma kayan aikin da na fi so don magance matsalar kamar "Me yasa wannan software baya aiki a gare ni?" ake kira madauri.

Menene strace?

madauri kayan aiki ne don "binciken kiran tsarin". An ƙirƙira shi da farko don Linux, amma ana iya yin dabaru iri ɗaya tare da kayan aikin don wasu tsarin (DTrace ko ktrace).

Ainihin aikace-aikace ne mai sauqi qwarai. Kuna buƙatar kawai gudanar da layi tare da kowane umarni kuma zai zubar da duk kiran tsarin (kodayake da farko za ku iya shigar da shi da kanku. madauri):

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

Menene waɗannan kiran tsarin? Wannan wani abu ne kamar API don kernel tsarin aiki. A wani lokaci, software yana samun damar kai tsaye zuwa kayan aikin da yake aiki da shi. Idan, alal misali, yana buƙatar nuna wani abu akan allon, yana kunna tare da tashar jiragen ruwa ko rajistar taswirar ƙwaƙwalwar ajiya don na'urorin bidiyo. Lokacin da tsarin kwamfuta da yawa ya zama sananne, hargitsi ya yi sarauta yayin da aikace-aikace daban-daban suka yi yaƙi akan kayan aikin. Kurakurai a cikin aikace-aikacen ɗaya na iya saukar da wasu, idan ba duka tsarin ba. Sannan hanyoyin gata (ko “kariyar zobe”) sun bayyana a cikin CPU. Kwayar ta zama mafi gata: ta sami cikakken damar yin amfani da kayan aikin, yana haifar da ƙarancin gata aikace-aikace waɗanda tuni sun buƙaci samun dama daga kernel don yin hulɗa tare da kayan aikin ta hanyar kiran tsarin.

A matakin binary, kiran tsarin ya ɗan bambanta da kiran aiki mai sauƙi, amma yawancin shirye-shirye suna amfani da nannade a cikin daidaitaccen ɗakin karatu. Wadancan. madaidaicin ɗakin karatu na POSIX C ya ƙunshi kiran aiki rubuta (), wanda ya ƙunshi duk ƙayyadaddun ƙayyadaddun tsarin gine-gine don kiran tsarin rubuta.

Gyara aikin aikin software tare da madaidaici

A takaice, duk wata mu'amala tsakanin aikace-aikace da muhallinta (tsarin kwamfuta) ana yin ta ne ta hanyar kiran tsarin. Don haka, lokacin da software ke aiki akan na'ura ɗaya amma ba akan wata ba, zai yi kyau a kalli sakamakon tsarin kiran tsarin. Musamman ma, ga jerin abubuwan da ake iya tantancewa ta amfani da alamar kiran tsarin:

  • Console I/O
  • Cibiyar sadarwa I/O
  • Samun damar tsarin fayil da fayil I/O
  • Sarrafa tsawon rayuwar zaren tsari
  • Gudanar da ƙananan ƙwaƙwalwar ajiya
  • Samun dama ga takamaiman direbobin na'ura

Yaushe za a yi amfani da strace?

A ka'idar, madauri da aka yi amfani da shi tare da kowane shiri a cikin sararin mai amfani, saboda kowane shiri a cikin sararin samaniya dole ne yayi kiran tsarin. Yana aiki da inganci tare da haɗaɗɗen shirye-shiryen ƙananan matakan, amma kuma yana aiki tare da manyan harsuna kamar Python idan zaku iya yanke ƙarin amo daga lokacin aiki da mai fassara.

A cikin dukkan daukakarsa madauri yana bayyana kansa a lokacin da ake cire kayan masarufi da ke aiki da kyau a kan wata na'ura, amma ba zato ba tsammani ya daina aiki akan wani, yana samar da saƙon da ba a sani ba game da fayiloli, izini, ko ƙoƙarin aiwatar da wasu umarni ko wani abu da bai yi nasara ba... Abin takaici ne, amma ba haka ba. haɗe da kyau tare da manyan matsaloli kamar kurakuran tabbatar da takaddun shaida. Yawancin lokaci wannan yana buƙatar haɗuwa madauriwani lokacin ltrace da kayan aikin matakin mafi girma (kamar kayan aikin layin umarni openssl don cire takaddun shaida).

Za mu yi amfani da uwar garken tsaye a matsayin misali, amma ana iya gano tsarin kiran tsarin sau da yawa akan dandamalin turawa masu rikitarwa. Kuna buƙatar kawai zaɓi kayan aikin da suka dace.

Misali mai sauƙin gyara kuskure

Bari mu ce kuna son gudanar da aikace-aikacen sabar mai ban mamaki foo, kuma wannan shine abin da kuka ƙare da:

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

A bayyane yake ba zai iya samun fayil ɗin daidaitawa da kuka rubuta ba. Wannan yana faruwa ne saboda wani lokaci lokacin da manajojin fakiti suka tattara aikace-aikace, suna ƙetare wuraren da ake tsammanin fayil ɗin. Kuma idan kun bi jagorar shigarwa don rarraba ɗaya, a cikin wani za ku sami fayiloli daban-daban daga inda kuke tsammani. Za a iya magance matsalar a cikin daƙiƙa biyu idan saƙon kuskure ya faɗi inda za a nemi fayil ɗin daidaitawa, amma ba haka ba. To ina za a duba?

Idan kana da damar yin amfani da lambar tushe, za ka iya karanta shi kuma gano komai. Kyakkyawan tsarin wariyar ajiya, amma ba mafita mafi sauri ba. Kuna iya yin amfani da mai gyara mataki-mataki kamar gdb kuma ku ga abin da shirin yake yi, amma yana da tasiri sosai don amfani da kayan aiki wanda aka tsara musamman don nuna hulɗa tare da muhalli: madauri.

ƙarshe madauri na iya zama kamar mai wuya, amma labari mai daɗi shine cewa yawancinsu ana iya yin watsi da su cikin aminci. Yawancin lokaci yana da amfani don amfani da afaretan -o don adana sakamakon bincike zuwa wani fayil na daban:

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

Kusan dukkan shafin farko na fitarwa madauri - Wannan yawanci shirye-shiryen ƙananan matakai ne don ƙaddamarwa. (Kira da yawa mmap, gyara, Brk don abubuwa kamar gano ƙananan ƙwaƙwalwar ajiya da kuma nuna ɗakunan karatu masu ƙarfi.) A zahiri, yayin cire abubuwan fitarwa. madauri Yana da kyau a karanta daga ƙarshe. Za a yi kalubale a kasa rubuta, wanda ke nuna saƙon kuskure. Mun duba sama mun ga kiran tsarin kuskure na farko - kira buda, wanda ke jefa kuskure ENOENT ("ba a samo fayil ko kundin adireshi ba") ƙoƙarin buɗewa /etc/foo/config.json. Wannan shine inda ya kamata fayil ɗin sanyi ya kasance.

Wannan misali ne kawai, amma zan ce kashi 90% na lokacin da nake amfani da su madauri, babu wani abu mafi wuya a yi fiye da wannan. A ƙasa akwai cikakken jagorar gyara mataki-mataki:

  • Yi fushi saboda saƙon m game da kuskuren tsarin-y daga shirin
  • Sake kunna shirin da madauri
  • Nemo saƙon kuskure a cikin sakamakon binciken
  • Tafi sama har sai kun buga kiran tsarin farko da ya gaza

Da alama kiran tsarin a mataki na 4 zai bayyana abin da ba daidai ba.

Alamomi

Kafin in nuna muku misali na ɓarna mai rikitarwa, zan nuna muku ƴan dabaru don ingantaccen amfani madauri:

mutum abokinka ne

A kan yawancin tsarin * nix, ana iya samun cikakken jerin kiran tsarin zuwa kernel ta hanyar gudu mutum syscals. Za ku ga abubuwa kamar brk(2), wanda ke nufin ana iya samun ƙarin bayani ta hanyar gudu mutum 2 brk.

Karamin rake: mutum 2 cokali ya nuna min shafin harsashi cokali mai yatsu () в GNU libc, wanda, ya bayyana, ana aiwatar da shi ta hanyar kira clone(). Kiran ilimin harshe Cokali mai yatsa ya kasance iri ɗaya idan kun rubuta shirin ta amfani da shi cokali mai yatsu (), kuma gudanar da bincike - Ba zan sami wani kira ba Cokali mai yatsa, maimakon su za a yi clone(). Irin waɗannan rake suna ruɗa ku ne kawai idan kun fara kwatanta tushen da fitarwa madauri.

Yi amfani da -o don ajiye fitarwa zuwa fayil

madauri na iya samar da fitarwa mai yawa, don haka galibi yana da amfani don adana sakamakon bincike a cikin fayiloli daban-daban (kamar a cikin misalin sama). Wannan kuma yana taimakawa wajen guje wa fitowar shirye-shiryen rikice tare da fitarwa madauri a cikin console.

Yi amfani da-s don duba ƙarin bayanan gardama

Wataƙila kun lura cewa ba a nuna rabin na biyu na saƙon kuskure a cikin misalin misalin da ke sama. Saboda madauri tsoho yana nuna kawai baiti 32 na farkon gardamar kirtani. Idan kuna son ƙarin gani, ƙara wani abu kamar -s 128 zuwa kira madauri.

-y yana sauƙaƙa waƙa fayiloli, kwasfa, da sauransu.

"All is file" yana nufin cewa * tsarin nix yana yin duk I/O ta amfani da masu siffanta fayil, ko wannan ya shafi fayil ko hanyar sadarwa ko bututun shiga tsakani. Wannan ya dace da shirye-shirye, amma yana sa ya zama da wahala a lura da ainihin abin da ke faruwa lokacin da kuka ga gama gari karanta и rubuta a cikin tsarin kira sakamakon sakamakon.

Ta ƙara mai aiki Ee, za ku tilasta madauri bayyana kowane mai bayanin fayil a cikin fitarwa tare da bayanin abin da yake nunawa.

Haɗa zuwa tsarin da ya riga ya gudana tare da -p**

Kamar yadda za ku gani daga misalin da ke ƙasa, wani lokaci kuna buƙatar gano shirin da ke gudana. Idan an san cewa yana gudana azaman tsari 1337 (ce, daga fitarwa ps), sannan zaku iya gano shi kamar haka:

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

Kuna iya buƙatar haƙƙin tushen.

Yi amfani da -f don saka idanu kan matakan yara

madauri Ta hanyar tsoho, yana bin tsari ɗaya kawai. Idan wannan tsari ya haifar da matakai na yara, to ana iya ganin tsarin kiran tsarin don spawn tsarin yaro, amma tsarin tsarin yaron ba zai nuna ba.

Idan kuna tunanin kuskuren yana cikin tsarin yara, yi amfani da bayanin -f, wannan zai ba da damar gano ta. Abin da ya rage ga wannan shi ne cewa fitarwa zai ƙara ruɗe ku. Yaushe madauri yana gano tsari ɗaya ko zare ɗaya, yana nuna rafi ɗaya na abubuwan kira. Lokacin da yake bibiyar matakai da yawa a lokaci ɗaya, ƙila ka ga farkon kira ya katse ta hanyar saƙo , sa'an nan - gungu na kira ga sauran rassan kisa, kuma sai kawai - ƙarshen na farko <… an ci gaba da wasan kwallon kafa>. Ko raba duk sakamakon binciken zuwa fayiloli daban-daban, kuma ta amfani da afareta -ff (cikakken bayani jagoranci a kan madauri).

Tace alamomi ta amfani da -e

Kamar yadda kake gani, sakamakon binciken shine ainihin tarin duk kiran tsarin da zai yiwu. Tuta -e Kuna iya tace alamar (duba jagora a kan madauri). Babban fa'idar shi ne cewa yana da sauri don gudanar da alamar da aka tace fiye da yin cikakken alama sannan grep`a. A gaskiya, kusan ko da yaushe ban damu ba.

Ba duk kurakurai ba su da kyau

Misali mai sauƙi kuma gama gari shine shirin neman fayil a wurare da yawa a lokaci ɗaya, kamar harsashi da ke neman kundin adireshi wanda ya ƙunshi fayil mai aiwatarwa:

$ 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 kamar "buƙata ta ƙarshe kafin bayar da rahoton kuskure" suna da kyau wajen gano kurakuran da suka dace. Ko ta yaya, yana da ma'ana a fara daga ƙarshe.

Koyawan shirye-shirye na C na iya taimaka muku fahimtar kiran tsarin.

Madaidaicin kira zuwa ɗakunan karatu na C ba kiran tsarin ba ne, sai dai ƙaramar saman ƙasa. Don haka, idan kun fahimci aƙalla kaɗan yadda da abin da za ku yi a cikin C, zai kasance da sauƙi a gare ku don fahimtar sakamakon tsarin kiran tsarin. Misali, kuna da matsala wajen gyara kira zuwa tsarin cibiyar sadarwa, duba irin na zamani Bija's Guide to Network Programming.

Misali mafi rikitarwa mai rikitarwa

Na riga na faɗi cewa misalin sauƙi mai sauƙi shine misalin abin da na fi dacewa da shi lokacin aiki tare madauri. Koyaya, wani lokacin ana buƙatar bincike na gaske, don haka ga misalin rayuwa ta ainihi na ƙarin gyara kurakurai.

bcron - mai tsara tsarin aiki, wani aiwatar da * nix daemon cron. An shigar dashi akan uwar garken, amma lokacin da wani yayi ƙoƙarin gyara jadawalin, wannan shine abin da ya faru:

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

To, wannan yana nufin bcron yayi ƙoƙarin rubuta wani fayil, amma bai yi aiki ba, kuma ba zai yarda da dalili ba. Budewa madauri:

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

Akwai saƙon kuskure kusa da ƙarshe rubuta, amma wannan lokacin wani abu ya bambanta. Na farko, babu kuskuren kiran tsarin da ya dace, wanda yawanci yakan faru kafin wannan. Na biyu, a bayyane yake cewa wani wuri wani ya riga ya karanta saƙon kuskure. Yana kama da ainihin matsalar wani wuri ne, kuma bcrontab kawai kunna saƙon baya.

Idan ka duba mutum 2 karatu, za ku iya ganin cewa hujja ta farko (3) ita ce bayanin fayil, wanda *nix ke amfani da shi don duk aikin I/O. Ta yaya zan gano abin da bayanin fayil 3 ke wakilta? A cikin wannan yanayin, zaku iya gudu madauri tare da mai aiki Ee (duba sama) kuma zai gaya muku kai tsaye, amma don gano abubuwa kamar wannan, yana da amfani a san yadda ake karantawa da kuma tantance sakamakon binciken.

Tushen bayanin fayil na iya zama ɗaya daga cikin yawancin kiran tsarin (duk ya dogara da abin da mai siffantawa yake nufi - na'ura mai kwakwalwa, soket na cibiyar sadarwa, fayil ɗin kanta, ko wani abu dabam), amma ya kasance kamar yadda zai yiwu, muna nema. kira ta hanyar dawowa 3 (watau muna neman "= 3" a cikin sakamakon ganowa). A cikin wannan sakamakon akwai 2 daga cikinsu: buda a saman sosai kuma soket A tsakiya. buda yana buɗe fayil ɗin amma kusa da(3) sannan zai nuna ya sake rufewa. (Rake: Ana iya sake amfani da masu siffanta fayil idan an buɗe su da rufe su). Kira soket () dace domin shi ne na karshe a baya karanta (), kuma ya bayyana cewa bcrontab yana aiki tare da wani abu ta hanyar soket. Layi na gaba yana nuna cewa an haɗa bayanin fayil ɗin unix yankin soket kan hanya /var/run/bcron-spool.

Don haka, muna buƙatar nemo tsarin da ke tattare da shi unix soket a daya bangaren. Akwai dabaru masu tsafta guda biyu don wannan dalili, duka biyun suna da amfani don cire abubuwan aika sabar sabar. Na farko shine amfani netstat ko kuma sabo ss (socket status). Dukansu umarni suna nuna haɗin haɗin yanar gizon aiki na tsarin kuma ɗauki bayanin -l don bayyana ramukan saurare, da kuma mai aiki -p don nuna shirye-shiryen da aka haɗa zuwa soket a matsayin abokin ciniki. (Akwai ƙarin zaɓuɓɓuka masu amfani, amma waɗannan biyu sun isa ga wannan aikin.)

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

Wannan yana nuna cewa mai sauraro shine umarni inixserver, Yana gudana tare da ID na tsari 20629. (Kuma, ba zato ba tsammani, yana amfani da bayanin fayil 3 azaman soket.)

Ana kiran kayan aiki na biyu na gaske mai amfani don gano wannan bayanin mayanar. Yana jera duk buɗaɗɗen fayiloli (ko masu siffanta fayil) akan tsarin. Ko kuna iya samun bayanai game da takamaiman fayil guda:

# 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

Tsari 20629 sabar ce mai tsayi, don haka zaka iya haɗa shi zuwa madauri amfani da wani abu kamar strace -o /tmp/trace -p 20629. Idan ka gyara aikin cron a wani tashar tashar, za ka sami fitarwa tare da kuskure. Kuma ga sakamakon:

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

(Na karshe karba () ba za a kammala lokacin ganowa ba.) Bugu da ƙari, abin takaici, wannan sakamakon bai ƙunshi kuskuren da muke nema ba. Ba mu ga kowane saƙon da bcrontag ya aika zuwa ko karɓa daga soket. Madadin haka, cikakken sarrafa tsari (clone, jira 4, SIGCHLD da dai sauransu) Wannan tsari yana haifar da tsarin yaro, wanda, kamar yadda za ku iya tsammani, yana yin aikin gaske. Kuma idan kuna buƙatar kama hanyarta, ƙara zuwa kiran zare -f. Wannan shine abin da za mu samu lokacin da muka nemo saƙon kuskure a cikin sabon sakamakon tare da 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 +++

Yanzu, wannan wani abu ne. Tsarin 21470 yana karɓar kuskuren "An hana shiga" lokacin ƙoƙarin ƙirƙirar fayil a hanya tmp/spool.21470.1573692319.854640 (dangane da kundin aiki na yanzu). Idan kawai mun san kundin adireshin aiki na yanzu, da ma mun san cikakkiyar hanyar kuma mu iya gano dalilin da yasa tsarin ba zai iya ƙirƙirar fayil ɗin sa na wucin gadi a ciki ba. Abin takaici, tsarin ya riga ya fita, don haka ba za ku iya amfani kawai ba shafi-p 21470 don nemo kundin adireshi na yanzu, amma kuna iya aiki a cikin kishiyar shugabanci - nemi tsarin kiran tsarin PID 21470 wanda ke canza kundin adireshi. (Idan babu, PID 21470 dole ne ya gaji su daga iyayenta, kuma wannan ya riga ya wuce. zafi -p ba za a iya gano shi ba.) Wannan tsarin kira shine chdir (wanda ke da sauƙin ganowa tare da taimakon injunan bincike na kan layi na zamani). Kuma ga sakamakon bincike na baya dangane da sakamakon binciken, har zuwa uwar garken 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 +++

(Idan kun ɓace, kuna iya karanta post dina na baya game da * sarrafa tsarin nix da harsashi.) Don haka, uwar garken PID 20629 bai sami izini don ƙirƙirar fayil a hanya ba /var/spool/cron/tmp/spool.21470.1573692319.854640. Mafi mahimmanci, dalilin wannan shine saitunan izinin tsarin fayil na gargajiya. Mu duba:

# 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

Anan aka binne kare! Sabar tana gudana azaman cron mai amfani, amma tushen kawai yana da izini don rubutawa zuwa kundin adireshi /var/spool/cron/tmp/. Umarni mai sauƙi chown cron /var/spool/cron/tmp/ zai tilasta bcron aiki daidai. (Idan ba wannan ba shine matsalar ba, to mai yiwuwa wanda ake tuhuma shine tsarin tsaro na kwaya kamar SELinux ko AppArmor, don haka zan bincika log ɗin saƙon kernel tare da. dmesg.)

Jimlar

Alamun kiran tsarin na iya zama mai ban sha'awa ga mafari, amma ina fata na nuna cewa hanya ce mai sauri don cire duk nau'ikan matsalolin turawa gama gari. Ka yi tunanin ƙoƙarin gyara tsarin aiki da yawa bcronta yin amfani da mai gyara mataki-by-step.

Binciken sakamakon binciken baya tare da jerin kira na tsarin yana buƙatar fasaha, amma kamar yadda na ce, kusan ko da yaushe, amfani madauri, Ina samun sakamakon binciken kawai kuma in nemi kurakurai farawa daga ƙarshe. Duk da haka, madauri yana taimaka min adana lokaci mai yawa akan gyara kuskure. Ina fatan zai kasance da amfani gare ku kuma.

source: www.habr.com

Add a comment