ç§ã®æ¬æ¥ã¯äž»ã«ãœãããŠã§ã¢ã®ãããã€ã¡ã³ããªã®ã§ã次ã®ãããªè³ªåã«çããã®ã«å€ãã®æéãè²»ãããŠããŸãã
- ãã®ãœãããŠã§ã¢ã¯éçºè ã«ãšã£ãŠã¯æ©èœããŸãããç§ã«ãšã£ãŠã¯æ©èœããŸããã ãªãïŒ
- æšæ¥ã¯ãã®ãœãããŠã§ã¢ã¯ããŸããããŸããããä»æ¥ã¯ããŸããããŸããã ãªãïŒ
ããã¯ãéåžžã®ãœãããŠã§ã¢ ãããã°ãšã¯å°ãç°ãªãçš®é¡ã®ãããã°ã§ãã éåžžã®ãããã°ã¯ã³ãŒãã®ããžãã¯ã«é¢ãããã®ã§ãããå±éãããã°ã¯ã³ãŒããšç°å¢ã®éã®çžäºäœçšã«é¢ãããã®ã§ãã åé¡ã®æ ¹æ¬ãè«çãšã©ãŒã ã£ããšããŠãããããã·ã³ã§ã¯ãã¹ãŠãæ©èœããå¥ã®ãã·ã³ã§ã¯æ©èœããªããšããäºå®ã¯ãåé¡ãäœããã®åœ¢ã§ç°å¢ã«ããããšãæå³ããŸãã
ãããã£ãŠã次ã®ãããªéåžžã®ãããã°ããŒã«ã®ä»£ããã« GDB ãããã€ã¡ã³ãããããã°ããããã®å¥ã®ããŒã« ã»ããããããŸãã ãããŠãããªããã®ãœãããŠã§ã¢ãåäœããªãã®ã§ãã?ããšããåé¡ã«å¯ŸåŠããããã®ç§ã®ãæ°ã«å ¥ãã®ããŒã«ã§ãã åŒã°ãã ã¹ãã©ã¹.
ã¹ãã¬ãŒã¹ãšã¯äœã§ããïŒ
åºæ¬çãªã¢ããªã±ãŒã·ã§ã³ã¯éåžžã«ã·ã³ãã«ã§ãã ä»»æã®ã³ãã³ã㧠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 +++
ãããã®ã·ã¹ãã ã³ãŒã«ã¯äœã§ãã? ããã¯ããªãã¬ãŒãã£ã³ã° ã·ã¹ãã ã«ãŒãã«ã® API ã®ãããªãã®ã§ãã ãã€ãŠããœãããŠã§ã¢ã¯ãããå®è¡ãããããŒããŠã§ã¢ã«çŽæ¥ã¢ã¯ã»ã¹ã§ããŸããã ããšãã°ãç»é¢ã«äœãã衚瀺ããå¿ èŠãããå Žåããã㪠ããã€ã¹ã®ããŒããŸãã¯ã¡ã¢ãª ããããããã¬ãžã¹ã¿ãæäœããŸãã ãã«ãã¿ã¹ã¯ã®ã³ã³ãã¥ãŒã¿ ã·ã¹ãã ãæ®åãããšãããŸããŸãªã¢ããªã±ãŒã·ã§ã³ãããŒããŠã§ã¢ãããã£ãŠäºå¥ªæŠãçºçããæ··ä¹±ãçããŸããã XNUMX ã€ã®ã¢ããªã±ãŒã·ã§ã³ã§ãšã©ãŒãçºçãããšãã·ã¹ãã å šäœã§ã¯ãªãã«ããŠããä»ã®ã¢ããªã±ãŒã·ã§ã³ãããŠã³ããå¯èœæ§ããããŸãã ãã®åŸãç¹æš©ã¢ãŒã (ãŸãã¯ããªã³ã°ä¿è·ã) ã CPU ã«ç»å ŽããŸããã ã«ãŒãã«ãæãç¹æš©ãæã€ããã«ãªããŸãããã«ãŒãã«ã¯ããŒããŠã§ã¢ãžã®å®å šãªã¢ã¯ã»ã¹æš©ãåãåããã·ã¹ãã ã³ãŒã«ãéããŠããŒããŠã§ã¢ãšå¯Ÿè©±ããããã«ã«ãŒãã«ã«ã¢ã¯ã»ã¹ãèŠæ±ããå¿ èŠããã£ããããç¹æš©ã®äœãã¢ããªã±ãŒã·ã§ã³ãçæããŸããã
ãã€ã㪠ã¬ãã«ã§ã¯ãã·ã¹ãã ã³ãŒã«ã¯åçŽãªé¢æ°åŒã³åºããšã¯å°ãç°ãªããŸãããã»ãšãã©ã®ããã°ã©ã ã¯æšæºã©ã€ãã©ãªã®ã©ãããŒã䜿çšããŸãã ãããã®ã POSIX C æšæºã©ã€ãã©ãªã«ã¯é¢æ°åŒã³åºããå«ãŸããŠããŸã æžãïŒïŒãã·ã¹ãã ã³ãŒã«ã®ã¢ãŒããã¯ãã£åºæã®ã³ãŒãããã¹ãŠå«ãŸããŠããŸãã æžããŸã.
ã€ãŸããã¢ããªã±ãŒã·ã§ã³ãšãã®ç°å¢ (ã³ã³ãã¥ãŒã¿ãŒ ã·ã¹ãã ) éã®å¯Ÿè©±ã¯ã·ã¹ãã ã³ãŒã«ãéããŠå®è¡ãããŸãã ãããã£ãŠããœãããŠã§ã¢ããããã·ã³ã§ã¯åäœããããå¥ã®ãã·ã³ã§ã¯åäœããªãå Žåã¯ãã·ã¹ãã ã³ãŒã«ã®ãã¬ãŒã¹çµæã確èªãããšããã§ãããã ããå ·äœçã«ã¯ãã·ã¹ãã ã³ãŒã« ãã¬ãŒã¹ã䜿çšããŠåæã§ããå žåçãªç¬éã®ãªã¹ãã次ã«ç€ºããŸãã
- ã³ã³ãœãŒã« I/O
- ãããã¯ãŒã¯I/O
- ãã¡ã€ã« ã·ã¹ãã ã¢ã¯ã»ã¹ãšãã¡ã€ã« I/O
- ããã»ã¹ã¹ã¬ããã®åç¶æéã®ç®¡ç
- äœã¬ãã«ã®ã¡ã¢ãªç®¡ç
- ç¹å®ã®ããã€ã¹ãã©ã€ããŒãžã®ã¢ã¯ã»ã¹
strace ããã€äœ¿çšããã?
çè«çã«ã¯ã ã¹ãã©ã¹ ãŠãŒã¶ãŒç©ºéã®ããã°ã©ã ã¯ã·ã¹ãã ã³ãŒã«ãè¡ãå¿ èŠãããããããŠãŒã¶ãŒç©ºéã®ããã°ã©ã ã§äœ¿çšãããŸãã ã³ã³ãã€ã«æžã¿ã®äœã¬ãã« ããã°ã©ã ã§ããå¹ççã«åäœããŸãããã©ã³ã¿ã€ã ãã€ã³ã¿ãŒããªã¿ããã®è¿œå ãã€ãºãã«ããã§ããã°ãPython ãªã©ã®é«ã¬ãã«èšèªã§ãåäœããŸãã
ãã¹ãŠã®çŽ æŽããã㧠ã¹ãã©ã¹ ãããã·ã³ã§ã¯æ£åžžã«åäœãããœãããŠã§ã¢ã®ãããã°äžã«çŸããŸãããå¥ã®ãã·ã³ã§ã¯çªç¶åäœãåæ¢ãããã¡ã€ã«ãæš©éããŸãã¯ã³ãã³ãããã®ä»ã®äœããå®è¡ããããšããŠå€±æããããšã«é¢ãããããŸããªã¡ãã»ãŒãžã衚瀺ãããŸããæ®å¿µã§ãããããã§ã¯ãããŸããã蚌ææžæ€èšŒãšã©ãŒãªã©ã®é«ã¬ãã«ã®åé¡ãšããŸãçµã¿åãããããšãã§ããŸãã éåžžãããã«ã¯çµã¿åãããå¿
èŠã§ã ã¹ãã©ã¹æã
äŸãšããŠã¹ã¿ã³ãã¢ãã³ ãµãŒããŒã䜿çšããŸãããã·ã¹ãã ã³ãŒã« ãã¬ãŒã¹ã¯å€ãã®å Žåãããè€éãªå±éãã©ãããã©ãŒã ã§ãå®è¡ã§ããŸãã å¿ èŠãªã®ã¯ãé©åãªããŒã«ãéžæããããšã ãã§ãã
ç°¡åãªãããã°äŸ
çŽ æŽããããµãŒã㌠ã¢ããªã±ãŒã·ã§ã³ foo ãå®è¡ãããšãæçµçã«æ¬¡ã®çµæãåŸããããšããŸãã
$ foo
Error opening configuration file: No such file or directory
ã©ããããããªããæžããèšå®ãã¡ã€ã«ãèŠã€ãããªãã£ãããã§ãã ããã¯ãããã±ãŒãž ãããŒãžã£ãŒãã¢ããªã±ãŒã·ã§ã³ãã³ã³ãã€ã«ãããšãã«ãäºæããããã¡ã€ã«ã®å ŽæããªãŒããŒã©ã€ãããå Žåãããããã«çºçããŸãã ãŸãããããã£ã¹ããªãã¥ãŒã·ã§ã³ã®ã€ã³ã¹ããŒã« ã¬ã€ãã«åŸã£ãŠãããšãå¥ã®ãã£ã¹ããªãã¥ãŒã·ã§ã³ã§ã¯ãäºæ³ããŠããå Žæãšã¯ãŸã£ããç°ãªããã¡ã€ã«ãèŠã€ãããŸãã ãšã©ãŒ ã¡ãã»ãŒãžã«èšå®ãã¡ã€ã«ã®å Žæã瀺ãããŠããã°åé¡ã¯æ°ç§ã§è§£æ±ºã§ããŸãããããã§ã¯ãããŸããã ã§ã¯ãã©ããèŠãã°ããã®ã§ããããïŒ
ãœãŒã¹ã³ãŒãã«ã¢ã¯ã»ã¹ã§ããã°ããããèªãã§ãã¹ãŠãç¥ãããšãã§ããŸãã åªããããã¯ã¢ããèšç»ã§ãããæéã®ãœãªã¥ãŒã·ã§ã³ã§ã¯ãããŸããã 次ã®ãããªã¹ããããã€ã¹ãããã®ãããã¬ã«é Œãããšãã§ããŸã GDB ããã°ã©ã ã®åäœã確èªããŸãããç°å¢ãšã®å¯Ÿè©±ã瀺ãããã«ç¹å¥ã«èšèšãããããŒã«ã䜿çšããæ¹ãã¯ããã«å¹æçã§ãã ã¹ãã©ã¹.
åºå ã¹ãã©ã¹ åé·ã«æãããããããŸãããã幞ããªããšã«ããã®ã»ãšãã©ã¯ç¡èŠããŠãåé¡ãããŸããã å€ãã®å Žåã-o æŒç®åã䜿çšããŠãã¬ãŒã¹çµæãå¥ã®ãã¡ã€ã«ã«ä¿åãããšäŸ¿å©ã§ãã
$ 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 +++
åºåã®æåã®ããŒãžã®ã»ãŒå šäœ ã¹ãã©ã¹ - ããã¯éåžžãèµ·åã®ããã®äœã¬ãã«ã®æºåã§ãã (é»è©±ãå€ã mmap, mãããã¯ã, BRK äœã¬ãã«ã®ã¡ã¢ãªã®æ€åºãåçã©ã€ãã©ãªã®è¡šç€ºãªã©ã«äœ¿çšãããŸãã)å®éã«ã¯ãåºåã®ãããã°äžã« ã¹ãã©ã¹ æåŸããèªãã ã»ããããã§ããã 以äžã«ãã£ã¬ã³ãžããããŸã æžããŸãããšã©ãŒ ã¡ãã»ãŒãžã衚瀺ãããŸãã äžãèŠããšãæåã®èª€ã£ãã·ã¹ãã ã³ãŒã«ãã€ãŸãåŒã³åºããããããŸãã éãããšã©ãŒãã¹ããŒãããŸã ãšããšã³ã (ããã¡ã€ã«ãŸãã¯ãã£ã¬ã¯ããªãèŠã€ãããŸããã) ãéãããšããŠããŸã /etc/foo/config.jsonã ããã«èšå®ãã¡ã€ã«ãããã¯ãã§ãã
ããã¯ã»ãã®äžäŸã§ãããç§ã䜿çšããæéã® 90% 㯠ã¹ãã©ã¹ãããã»ã©é£ããããšã¯ãããŸããã 以äžã¯å®å šãªã¹ããããã€ã¹ãããã®ãããã° ã¬ã€ãã§ãã
- ããã°ã©ã ããã®ã·ã¹ãã y ãšã©ãŒã«é¢ãããããŸããªã¡ãã»ãŒãžã®ããã«åæºãã
- 次ã®ã³ãã³ãã§ããã°ã©ã ãåèµ·åããŸã ã¹ãã©ã¹
- ãã¬ãŒã¹çµæã§ãšã©ãŒ ã¡ãã»ãŒãžãèŠã€ãã
- æåã«å€±æããã·ã¹ãã ã³ãŒã«ã«å°éãããŸã§ããã«äžã«é²ã¿ãŸã
ã¹ããã 4 ã®ã·ã¹ãã ã³ãŒã«ã«ãã£ãŠãäœãåé¡ã ã£ãã®ããæããã«ãªãå¯èœæ§ãéåžžã«é«ããªããŸãã
ãã³ã
ããè€éãªãããã°ã®äŸã瀺ãåã«ãå¹æçã«äœ¿çšããããã®ããã€ãã®ããªãã¯ã瀺ããŸãã ã¹ãã©ã¹:
ç·ã¯ããªãã®åéã§ã
å€ãã® *nix ã·ã¹ãã ã§ã¯ã次ã®ã³ãã³ããå®è¡ãããšãã«ãŒãã«ãžã®ã·ã¹ãã ã³ãŒã«ã®å®å šãªãªã¹ããååŸã§ããŸãã ç·ã®ã·ã¹ãã ã³ãŒã«ã 次ã®ãããªãã®ã衚瀺ãããŸã ãã¬ãŒã(2)ãå®è¡ãããšãããå€ãã®æ å ±ãååŸã§ããããšãæå³ããŸãã ç·2ã®äŒæ©æ.
å°ããªçæ: ãã³2ãã©ãŒã¯ ã·ã§ã«ã®ããŒãžã衚瀺ããŸã ãã©ãŒã¯ïŒïŒ в GNU libcãããã¯åŒã³åºãã䜿çšããŠå®è£ ãããŠããããšãããããŸãã ã¯ããŒã³ïŒïŒã åŒã³åºãã»ãã³ãã£ã¯ã¹ ãã©ãŒã¯ ã䜿çšããŠããã°ã©ã ãæžããŠããåããŸãŸã§ã ãã©ãŒã¯ïŒïŒããã¬ãŒã¹ãå®è¡ããŸã - åŒã³åºãã¯èŠã€ãããŸãã ãã©ãŒã¯ããããã®ä»£ããã«ã ã¯ããŒã³ïŒïŒã ãã®ãã㪠rake ã¯ããœãŒã¹ãšåºåãæ¯èŒãå§ãããšæ··ä¹±ããã ãã§ãã ã¹ãã©ã¹.
-o ã䜿çšããŠåºåããã¡ã€ã«ã«ä¿åããŸã
ã¹ãã©ã¹ ã¯å€§éã®åºåãçæããå¯èœæ§ãããããã(äžèšã®äŸã®ããã«) ãã¬ãŒã¹çµæãå¥ã®ãã¡ã€ã«ã«ä¿åãããšäŸ¿å©ãªããšããããããŸãã ããã¯ãããã°ã©ã åºåãšåºåã®æ··åãé¿ããã®ã«ã圹ç«ã¡ãŸãã ã¹ãã©ã¹ ã³ã³ãœãŒã«ã§ã
ããã«å€ãã®åŒæ°ããŒã¿ã衚瀺ããã«ã¯ã-s ã䜿çšããŸã
äžã®ãã¬ãŒã¹äŸã§ã¯ããšã©ãŒ ã¡ãã»ãŒãžã®åŸåã衚瀺ãããŠããªãããšã«æ°ã¥ãããããããŸããã ãã®çç±ã¯ ã¹ãã©ã¹ ããã©ã«ãã§ã¯ãæåååŒæ°ã®æåã® 32 ãã€ãã®ã¿ã衚瀺ãããŸãã ãã£ãšèŠããå Žåã¯ã次ã®ãããªãã®ãè¿œå ããŠãã ãã -s 128 åŒã³åºãã« ã¹ãã©ã¹.
-y ã䜿çšãããšããã¡ã€ã«ããœã±ãããªã©ã远跡ãããããªããŸãã
ããã¹ãŠããã¡ã€ã«ã§ããããšã¯ã*nix ã·ã¹ãã ãããã¡ã€ã«ããããã¯ãŒã¯ããŸãã¯ããã»ã¹éãã€ãã«é©çšããããã©ããã«é¢ä¿ãªãããã¡ã€ã«èšè¿°åã䜿çšããŠãã¹ãŠã® I/O ãå®è¡ããããšãæå³ããŸãã ããã¯ããã°ã©ãã³ã°ã«ã¯äŸ¿å©ã§ãããäžè¬çãªãã®ãèŠããšå®éã«äœãèµ·ãã£ãŠãããã远跡ããã®ãé£ãããªããŸãã read О æžããŸã ã·ã¹ãã ã³ãŒã«ãã¬ãŒã¹çµæã«è¡šç€ºãããŸãã
æŒç®åãè¿œå ããããšã§ ããã匷å¶ããŸã ã¹ãã©ã¹ åºåå ã®åãã¡ã€ã«èšè¿°åã«ããããæãå 容ã®æ³šéãä»ããŸãã
-p** ã䜿çšããŠããã§ã«å®è¡äžã®ããã»ã¹ã«ã¢ã¿ããããŸãã
以äžã®äŸãããããããã«ããã§ã«å®è¡äžã®ããã°ã©ã ããã¬ãŒã¹ããå¿ èŠãããå ŽåããããŸãã ããã»ã¹ 1337 ãšããŠå®è¡ãããŠããããšãããã£ãŠããå Žå (ããšãã°ãåºåãã) ps)ã次ã®ããã«è¿œè·¡ã§ããŸãã
$ strace -p 1337
...system call trace output...
root æš©éãå¿ èŠãªå ŽåããããŸãã
åããã»ã¹ãç£èŠããã«ã¯ -f ã䜿çšããŸã
ã¹ãã©ã¹ ããã©ã«ãã§ã¯ãXNUMX ã€ã®ããã»ã¹ã®ã¿ããã¬ãŒã¹ããŸãã ãã®ããã»ã¹ãåããã»ã¹ãçæããå Žåãåããã»ã¹ãçæããã·ã¹ãã ã³ãŒã«ã¯è¡šç€ºãããŸãããåããã»ã¹ã®ã·ã¹ãã ã³ãŒã«ã¯è¡šç€ºãããŸããã
ãšã©ãŒãåããã»ã¹ã«ãããšæãããå Žåã¯ã次ã®ã¹ããŒãã¡ã³ãã䜿çšããŸãã -fãããã«ãããã¬ãŒã¹ãæå¹ã«ãªããŸãã ãã®æ¬ ç¹ã¯ãåºåãããã«æ··ä¹±ããããšã§ãã ã〠ã¹ãã©ã¹ XNUMX ã€ã®ããã»ã¹ãŸã㯠XNUMX ã€ã®ã¹ã¬ããããã¬ãŒã¹ãããšãåŒã³åºãã€ãã³ãã®åäžã®ã¹ããªãŒã ã衚瀺ãããŸãã è€æ°ã®ããã»ã¹ãåæã«ãã¬ãŒã¹ãããšãé話ã®éå§ãã¡ãã»ãŒãžã«ãã£ãŠäžæãããå ŽåããããŸãã ããã®åŸ - ä»ã®å®è¡ãã©ã³ãã«å¯Ÿããäžé£ã®åŒã³åºãããããŠãã®åŸã®ã¿ - æåã®å®è¡ãã©ã³ãã®çµäº <âŠæçŽåé>ã ãŸãã¯ããããæŒç®åã䜿çšããŠããã¹ãŠã®ãã¬ãŒã¹çµæãç°ãªããã¡ã€ã«ã«åå²ããŸãã -ff (詳现ã¯
-e ã䜿çšããŠãã¬ãŒã¹ããã£ã«ã¿ãªã³ã°ãã
ã芧ã®ãšããããã¬ãŒã¹ã®çµæã¯ãèãããããã¹ãŠã®ã·ã¹ãã ã³ãŒã«ã®å®éã®å±±ã§ãã ãã©ã° -e ãã¬ãŒã¹ããã£ã«ã¿ãªã³ã°ã§ããŸã (ã
ãã¹ãŠã®ééããæªãããã§ã¯ãªã
ã·ã³ãã«ã§äžè¬çãªäŸã¯ãå®è¡å¯èœãã¡ã€ã«ãå«ããã£ã¬ã¯ããªãæ¢ãã·ã§ã«ã®ããã«ãäžåºŠã«è€æ°ã®å Žæã§ãã¡ã€ã«ãæ¢ãããã°ã©ã ã§ãã
$ 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
...
ããšã©ãŒãå ±åããåã®æåŸã«å€±æãããªã¯ãšã¹ãããªã©ã®ãã¥ãŒãªã¹ãã£ãã¯ã¯ãé¢é£ãããšã©ãŒãèŠã€ããã®ã«é©ããŠããŸãã ãããã«ããŠããæåŸããå§ããã®ãåççã§ãã
C ããã°ã©ãã³ã°ã®ãã¥ãŒããªã¢ã«ã¯ãã·ã¹ãã ã³ãŒã«ãç解ããã®ã«åœ¹ç«ã¡ãŸãã
C ã©ã€ãã©ãªãžã®æšæºåŒã³åºãã¯ã·ã¹ãã ã³ãŒã«ã§ã¯ãªããèãè¡šé¢å±€ã«ãããŸããã ãããã£ãŠãC ã§ã©ã®ããã«äœãè¡ãããå°ãã§ãç解ãããšãã·ã¹ãã ã³ãŒã«ãã¬ãŒã¹ã®çµæãç解ãããããªããŸãã ããšãã°ããããã¯ãŒã¯ ã·ã¹ãã ãžã®åŒã³åºãã®ãããã°ã«åé¡ãããå Žåã¯ãåãå€å
žçãªã³ãŒããèŠãŠãã ããã
ããè€éãªãããã°ã®äŸ
åçŽãªãããã°ã®äŸã¯ãäœæ¥äžã«äž»ã«å¯ŸåŠããªããã°ãªããªããã®ã®äŸã§ãããšãã§ã«è¿°ã¹ãŸããã ã¹ãã©ã¹ã ãã ããå Žåã«ãã£ãŠã¯å®éã®èª¿æ»ãå¿ èŠã«ãªããããããé«åºŠãªãããã°ã®å®äŸã次ã«ç€ºããŸãã
# crontab -e -u logs
bcrontab: Fatal: Could not create temporary file
ããããŸãããã€ãŸã ãã¯ã㳠圌ã¯ç¹å®ã®ãã¡ã€ã«ãæžã蟌ãããšããŸããããããŸããããŸããã§ããã圌ã¯ãã®çç±ãèªããŸããã§ããã æããã«ãã ã¹ãã©ã¹:
# 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 +++
æåŸã®è¿ãã«ãšã©ãŒã¡ãã»ãŒãžããããŸã æžããŸãããããä»åã¯äœããéããŸãã ãŸããéåžžã¯ãã®åã«çºçãããé¢é£ããã·ã¹ãã ã³ãŒã« ãšã©ãŒããããŸããã 次ã«ãã©ããã§èª°ãããã§ã«ãšã©ãŒ ã¡ãã»ãŒãžãèªãã§ããããšã¯æããã§ãã æ¬åœã®åé¡ã¯å¥ã®ãšããã«ããããã§ããã ããã³ã¿ã åã«ã¡ãã»ãŒãžãåçããã ãã§ãã
èŠãã° ç·2ã¯èªãã æåã®åŒæ° (3) ããã¡ã€ã«èšè¿°åã§ããã*nix ããã¹ãŠã® I/O åŠçã«äœ¿çšããããšãããããŸãã ãã¡ã€ã«èšè¿°å 3 ãäœãè¡šããŠãããã確èªããã«ã¯ã©ãããã°ããã§ãã? ãã®ç¹å®ã®ã±ãŒã¹ã§ã¯ã次ãå®è¡ã§ããŸã ã¹ãã©ã¹ 調æ»çµæ ãã (äžèšãåç §) èªåçã«æããŠãããŸããããã®ãããªããšãç解ããã«ã¯ããã¬ãŒã¹çµæãèªã¿åãã解æããæ¹æ³ãç¥ã£ãŠãããšåœ¹ç«ã¡ãŸãã
ãã¡ã€ã«èšè¿°åã®ãœãŒã¹ã¯ãå€ãã®ã·ã¹ãã ã³ãŒã«ã® 3 ã€ã§ããå¯èœæ§ããããŸã (ãã¹ãŠã¯èšè¿°åã®ç®ç (ã³ã³ãœãŒã«ããããã¯ãŒã¯ ãœã±ããããã¡ã€ã«èªäœããŸãã¯ãã®ä»ã®ãã®) ã«ãã£ãŠç°ãªããŸã)ã 3 ãè¿ãããšã§åŒã³åºããŸã (ã€ãŸãããã¬ãŒã¹çµæã§ã= 2ããæ¢ããŸã)ã ãã®çµæã«ã¯ããã®ãã¡ã® XNUMX ã€ããããŸãã éã äžçªäžãš ãœã±ãã éäžã§ã éã ãã¡ã€ã«ã¯éããŸããã éãã(3) ã¯åã³éããããšã瀺ããŸãã (Rake: ãã¡ã€ã«èšè¿°åã¯ãéãããéããããããšãã«åå©çšã§ããŸã)ã é»è©± ãœã±ããïŒïŒ åã®æåŸãªã®ã§é©åã§ã èªãã ïŒïŒããããŠãbcrontab ã¯ãœã±ãããä»ããŠäœããæäœããããšãããããŸããã 次ã®è¡ã¯ããã¡ã€ã«èšè¿°åãé¢é£ä»ããããŠããããšã瀺ããŠããŸãã UNIXãã¡ã€ã³ãœã±ãã éäžã§ /var/run/bcron-spool.
ãããã£ãŠã次ã®ããã»ã¹ã«é¢é£ããããã»ã¹ãèŠã€ããå¿ èŠããããŸãã UNIXãœã±ãã å察åŽã«ãããŸãã ãã®ç®çã«ã¯ããã€ãã®å·§åŠãªããªãã¯ããããã©ã¡ãããµãŒããŒã®ãããã€ã¡ã³ãããããã°ããã®ã«åœ¹ç«ã¡ãŸãã XNUMXã€ç®ã¯ã䜿çšããããšã§ã netstat ãŸãã¯ããããæ°ãã ss (ãœã±ããã®ã¹ããŒã¿ã¹)ã ã©ã¡ãã®ã³ãã³ããã·ã¹ãã ã®ã¢ã¯ãã£ããªãããã¯ãŒã¯æ¥ç¶ã衚瀺ãã次ã®ã¹ããŒãã¡ã³ããååŸããŸãã -l ãªãã¹ã³ããŠãããœã±ãããšãªãã¬ãŒã¿ãŒã«ã€ããŠèª¬æããŸãã -p ã¯ã©ã€ã¢ã³ããšããŠãœã±ããã«æ¥ç¶ãããŠããããã°ã©ã ã衚瀺ããŸãã (ä»ã«ã䟿å©ãªãªãã·ã§ã³ã¯ãããããããŸããããã®ã¿ã¹ã¯ã«ã¯ããã XNUMX ã€ã§ååã§ãã)
# ss -pl | grep /var/run/bcron-spool
u_str LISTEN 0 128 /var/run/bcron-spool 1466637 * 0 users:(("unixserver",pid=20629,fd=3))
ããã¯ããªã¹ããŒãã³ãã³ãã§ããããšã瀺åããŠããŸãã inixãµãŒããŒãããã»ã¹ ID 20629 ã§å®è¡ãããŸãã (ãããŠãå¶ç¶ã«ãããã¡ã€ã«èšè¿°å 3 ããœã±ãããšããŠäœ¿çšããŸãã)
åãæ å ±ãèŠã€ããããã® XNUMX çªç®ã®éåžžã«äŸ¿å©ãªããŒã«ã¯ã lsofã ã·ã¹ãã äžã§éããŠãããã¹ãŠã®ãã¡ã€ã« (ãŸãã¯ãã¡ã€ã«èšè¿°å) ããªã¹ããããŸãã ãŸãã¯ãXNUMX ã€ã®ç¹å®ã®ãã¡ã€ã«ã«é¢ããæ å ±ãååŸããããšãã§ããŸãã
# 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
ããã»ã¹ 20629 ã¯åç¶æéã®é·ããµãŒããŒãªã®ã§ã次ã®ãµãŒããŒã«æ¥ç¶ã§ããŸãã ã¹ãã©ã¹ ã®ãããªãã®ã䜿çšã㊠strace -o /tmp/trace -p 20629ã å¥ã®ç«¯æ«ã§ cron ãžã§ããç·šéãããšããšã©ãŒã®ãããã¬ãŒã¹åºåã衚瀺ãããŸãã ãããŠçµæã¯æ¬¡ã®ãšããã§ãã
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
ïŒæåŸ acceptïŒïŒ ãã¬ãŒã¹æã«ã¯å®äºããŸããã) ç¹°ãè¿ãã«ãªããŸãããæ®å¿µãªããããã®çµæã«ã¯æ¢ããŠãããšã©ãŒãå«ãŸããŠããŸããã bcrontag ããœã±ãããšã®éã§éåä¿¡ããã¡ãã»ãŒãžã¯è¡šç€ºãããŸããã 代ããã«ãå®å šãªããã»ã¹å¶åŸ¡ ( , åŸ ã€4, ã·ã°ãã«ã ãªã©) ãã®ããã»ã¹ã¯ããæ³åã®ãšãããå®éã®äœæ¥ãè¡ãåããã»ã¹ãçæããŸãã 圌女ã®è¶³è·¡ã远跡ããå¿ èŠãããå Žåã¯ãé話ã«è¿œå ããŠãã ãã strace -fã ããã¯ã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 +++
ããŠãããã¯äœãã§ãã ããã»ã¹ 21470 ã¯ããã¹ã«ãã¡ã€ã«ãäœæããããšãããšãã¢ã¯ã»ã¹ãæåŠãããŸããããšã©ãŒãåãåããŸã tmp/spool.21470.1573692319.854640 (çŸåšã®äœæ¥ãã£ã¬ã¯ããªã«é¢é£ããŸã)ã çŸåšã®äœæ¥ãã£ã¬ã¯ããªã ãããããã°ããã«ãã¹ãããããããã»ã¹ããã®ãã£ã¬ã¯ããªã«äžæãã¡ã€ã«ãäœæã§ããªãçç±ãç解ã§ããã§ãããã æ®å¿µãªãããããã»ã¹ã¯ãã§ã«çµäºããŠãããããåã«äœ¿çšããããšã¯ã§ããŸãã lsof -p 21470 çŸåšã®ãã£ã¬ã¯ããªãèŠã€ããããã§ãããéã®æ¹åã«äœæ¥ããããšãã§ããŸããã€ãŸãããã£ã¬ã¯ããªãå€æŽãã PID 21470 ã·ã¹ãã ã³ãŒã«ãæ¢ããŸãã (äœããªãå ŽåãPID 21470 ã¯èŠªããããããç¶æ¿ããŠããå¿ èŠããããããã¯ãã§ã«å®äºããŠããŸãã lsof -p ã¯ããããŸãããïŒ ãã®ã·ã¹ãã ã³ãŒã«ã¯ã Chdir (ææ°ã®ãªã³ã©ã€ã³æ€çŽ¢ãšã³ãžã³ã䜿ãã°ç°¡åã«èŠã€ããããšãã§ããŸã)ã ãããŠãããã¯ããµãŒã㌠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 +++
(è¿·ã£ããååã®èšäºãèªãã§ã¿ãŠãã ãã
# 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
ãããç¬ãåè¬ãããŠããå Žæã§ãïŒ ãµãŒããŒã¯ãŠãŒã¶ãŒ cron ãšããŠå®è¡ãããŸããããã£ã¬ã¯ããªãžã®æžã蟌ã¿æš©éãæã€ã®ã¯ root ã ãã§ã /var/ã¹ããŒã«/cron/tmp/ã ç°¡åãªã³ãã³ã chown cron /var/spool/cron/tmp/ äœãäºå®ã§ã ãã¯ãã³ æ£ããåäœããŸãã (ãããåé¡ã§ã¯ãªãå Žåã次ã«çãããã®ã¯ SELinux ã AppArmor ãªã©ã®ã«ãŒãã« ã»ãã¥ãªã㣠ã¢ãžã¥ãŒã«ã§ãããã®ããã次ã®ããã«ããŠã«ãŒãã« ã¡ãã»ãŒãž ãã°ã確èªããŸãã dmesg.)
åèšã§
ã·ã¹ãã ã³ãŒã« ãã¬ãŒã¹ã¯åå¿è ã«ãšã£ãŠã¯å§åããããããããŸããããäžè¬çãªãããã€ã¡ã³ãã®åé¡ã®ã¯ã©ã¹å šäœããããã°ããç°¡åãªæ¹æ³ã§ããããšã瀺ããŠããã ããã°å¹žãã§ãã ãã«ãããã»ã¹ããããã°ããããšããŠãããšãããæ³åããŠãã ããã ãã¯ãã³ã¹ããããã€ã¹ããããããã¬ãŒã䜿çšããŸãã
ãã¬ãŒã¹çµæãã·ã¹ãã ã³ãŒã« ãã§ãŒã³ã«æ²¿ã£ãŠéæ¹åã«è§£æããã«ã¯ã¹ãã«ãå¿ èŠã§ãããåè¿°ããããã«ãã»ãšãã©ã®å Žåã ã¹ãã©ã¹, ãã¬ãŒã¹çµæãååŸããŠãæåŸãããšã©ãŒãæ¢ããŠããã ãã§ãã ãšãããã ã¹ãã©ã¹ ãããã°ã«ãããââæéãå€§å¹ ã«ç¯çŽã§ããŸãã ããªãã«ã圹ç«ã€ããšãé¡ã£ãŠããŸãã
åºæïŒ habr.com