
ç§ã®æ¥åžžæ¥åã¯äž»ã«ãœãããŠã§ã¢ ã·ã¹ãã ã®å°å ¥ã§ããã€ãŸããæ¬¡ã®ãããªè³ªåã«çããã®ã«å€ãã®æéãè²»ãããŠããŸãã
- éçºè ã¯ãã®ãœãããŠã§ã¢ãåäœãããŠããŸãããç§ã®å Žåã¯åäœãããŠããŸããããªãïŒ
- æšæ¥ã¯ãã®ãœãããŠã§ã¢ã¯åäœããŸãããã仿¥ã¯åäœããŸããããªãïŒ
ããã¯ãéåžžã®ãœãããŠã§ã¢ã®ãããã°ãšã¯å°ãç°ãªãçš®é¡ã®ãããã°ã§ããéåžžã®ãããã°ã¯ã³ãŒãã®ããžãã¯ã«é¢ãããã®ã§ããããããã€ã¡ã³ã ãããã°ã¯ã³ãŒããšç°å¢ã®çžäºäœçšã«é¢ãããã®ã§ããåé¡ã®æ ¹æ¬ãè«çãšã©ãŒã§ãããšããŠãããã¹ãŠã 1 å°ã®ãã·ã³ã§åäœããã®ã«å¥ã®ãã·ã³ã§ã¯åäœããªããšããäºå®ã¯ãåé¡ãäœããã®åœ¢ã§ç°å¢ã«ããããšãæå³ããŸãã
ãã®ãããéåžžã®ãããã°ããŒã«ã®ä»£ããã« GDB ãããã€ã¡ã³ãããããã°ããããã®å¥ã®ããŒã«ã»ããããããŸãããããŠãããªããã®ãœãããŠã§ã¢ãæ©èœããªãã®ãïŒããšããåé¡ã«å¯ŸåŠããããã®ç§ã®ãæ°ã«å ¥ãã®ããŒã«ã§ãããã㯠ã¹ãã©ã¹.
straceãšã¯äœã§ãã?
âã¯ãã·ã¹ãã ã³ãŒã«ãã¬ãŒã¹ãã®ããã®ããŒã«ã§ããå ã 㯠Linuxããããåããããã°ãã¯ããã¯ã¯ä»ã®ã·ã¹ãã ã®ããŒã«ã§ãå®è¡ã§ããŸãïŒ ãŸã㯠).
åºæ¬çãªã¢ããªã±ãŒã·ã§ã³ã¯éåžžã«ã·ã³ãã«ã§ããä»»æã®ã³ãã³ãã§ 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 ã®ãããªãã®ã§ããæã¯ããœãããŠã§ã¢ã¯ãããå®è¡ãããããŒããŠã§ã¢ã«çŽæ¥ã¢ã¯ã»ã¹ããŠããŸãããããšãã°ãç»é¢ã«äœãã衚瀺ããå¿ èŠãããå Žåããã㪠ããã€ã¹ã®ããŒããã¡ã¢ãª ããã ã¬ãžã¹ã¿ãæäœããŸãããã«ãã¿ã¹ã¯ ã³ã³ãã¥ãŒã¿ ã·ã¹ãã ãæ®åãããšãããŸããŸãªã¢ããªã±ãŒã·ã§ã³ãããŒããŠã§ã¢ã奪ãåãããã«ãªããæ··ä¹±ãçããŸããã 1 ã€ã®ã¢ããªã±ãŒã·ã§ã³ã«ãã°ããããšãã·ã¹ãã å šäœã§ã¯ãªããšããä»ã®ã¢ããªã±ãŒã·ã§ã³ãããŠã³ããå¯èœæ§ããããŸãããã®åŸãCPU ã«ç¹æš©ã¢ãŒã (ãŸãã¯ããªã³ã°ä¿è·ã) ãç»å ŽããŸãããã«ãŒãã«ã¯æãç¹æš©ãæã€ããã«ãªããŸãããã€ãŸããããŒããŠã§ã¢ãžã®å®å šãªã¢ã¯ã»ã¹æš©ãååŸããã·ã¹ãã ã³ãŒã«ãéããŠããŒããŠã§ã¢ãšå¯Ÿè©±ããããã«ã«ãŒãã«ã«ã¢ã¯ã»ã¹ãèŠæ±ããå¿ èŠã®ãããæš©éã®äœãã¢ããªã±ãŒã·ã§ã³ãçæãããŸããã
ãã€ããªã¬ãã«ã§ã¯ãã·ã¹ãã ã³ãŒã«ã¯åçŽãªé¢æ°åŒã³åºããšã¯å°ãç°ãªããŸãããã»ãšãã©ã®ããã°ã©ã ã¯æšæºã©ã€ãã©ãªã®ã©ãããŒã䜿çšããŸãããããã®ã POSIX Cæšæºã©ã€ãã©ãªã«ã¯é¢æ°åŒã³åºããå«ãŸããŠããŸã æžãïŒïŒããã«ã¯ãã·ã¹ãã ã³ãŒã«ã®ã¢ãŒããã¯ãã£äŸåã®ã³ãŒãããã¹ãŠå«ãŸããŠããŸãã æžããŸã.

ã€ãŸããã¢ããªã±ãŒã·ã§ã³ãšãã®ç°å¢ (ã³ã³ãã¥ãŒã¿ ã·ã¹ãã ) éã®ããããããåãã¯ãã·ã¹ãã ã³ãŒã«ãéããŠå®è¡ãããŸãããããã£ãŠããœãããŠã§ã¢ã 1 å°ã®ãã·ã³ã§ã¯åäœããå¥ã®ãã·ã³ã§ã¯åäœããªãå Žåã¯ãã·ã¹ãã ã³ãŒã« ãã¬ãŒã¹ã®çµæã確èªãããšããã§ããããå ·äœçã«ã¯ãã·ã¹ãã ã³ãŒã« ãã¬ãŒã¹ã䜿çšããŠåæã§ããå žåçãªç¬éã®ãªã¹ãã以äžã«ç€ºããŸãã
- ã³ã³ãœãŒã«I/O
- ãããã¯ãŒã¯I/O
- ãã¡ã€ã«ã·ã¹ãã ã¢ã¯ã»ã¹ãšãã¡ã€ã«I/O
- ããã»ã¹/ã¹ã¬ããã®åç¶æéã®ç®¡ç
- äœã¬ãã«ã®ã¡ã¢ãªç®¡ç
- ç¹æ®ããã€ã¹ã®ãã©ã€ããŒãžã®ã¢ã¯ã»ã¹
strace ã¯ãã€äœ¿çšããã°ããã§ãã?
çè«çã«ã¯ã ã¹ãã©ã¹ ãããããŠãŒã¶ãŒç©ºéããã°ã©ã ã§ã·ã¹ãã ã³ãŒã«ãå®è¡ããå¿ èŠãããããããããããŠãŒã¶ãŒç©ºéããã°ã©ã ã§äœ¿çšãããŸããã³ã³ãã€ã«ãããäœã¬ãã«ããã°ã©ã ã§ã¯ããå¹ççã«åäœããŸãããã©ã³ã¿ã€ã ãšã€ã³ã¿ãŒããªã¿ãŒããã®äœåãªãã€ãºãåé¿ã§ããã°ãPython ãªã©ã®é«ã¬ãã«èšèªã§ãåäœããŸãã
ãã®æ å ã®ãã¹ãŠ ã¹ãã©ã¹ ãããã·ã³ã§ã¯æ£åžžã«åäœããããå¥ã®ãã·ã³ã§ã¯çªç¶åäœããªããªãããã¡ã€ã«ãæš©éã«é¢ãããããŸããªã¡ãã»ãŒãžã衚瀺ãããããäžéšã®ã³ãã³ãã®å®è¡ã«å€±æããããšãã£ãããœãããŠã§ã¢ã®ãããã°äžã«çºçããŸããæ®å¿µãªãããèšŒææžæ€èšŒãšã©ãŒãªã©ã®é«ã¬ãã«ã®åé¡ãšã¯ããŸãããŸãçµã¿åãããããšãã§ããŸãããéåžžãããã§ã¯çµã¿åãããå¿ èŠã§ã ã¹ãã©ã¹æã ããã³ããé«ã¬ãã«ã®ããŒã«ïŒã³ãã³ãã©ã€ã³ããŒã«ãªã©ïŒ opensslã® èšŒææžããããã°ããŸãã
ããã§ã¯åé¢ããããµãŒããŒãäŸãšããŠäœ¿çšããŸãããã·ã¹ãã ã³ãŒã«ã®ãã¬ãŒã¹ã¯ãããè€éãªãããã€ã¡ã³ã ãã©ãããã©ãŒã ã§ãå®è¡ã§ããå ŽåããããããŸããé©åãªããŒã«ãéžæããã ãã§ãã
ç°¡åãªãããã°äŸ
çŽ æŽããããµãŒã㌠ã¢ããªã±ãŒã·ã§ã³ 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 äœã¬ãã«ã®ã¡ã¢ãªæ€åºãåçã©ã€ãã©ãªãããã³ã°ãªã©ã®æ©èœããããŸããå®éããããã°æã«ã¯ãåºå ã¹ãã©ã¹ æåŸããèªãã®ãè¯ãã§ããããäžèšã«é»è©±ãããã£ãŠããŸã æžããŸãããšã©ãŒã¡ãã»ãŒãžã衚瀺ãããŸããäžãèŠããšãæåã®ãšã©ãŒã®ããã·ã¹ãã ã³ãŒã«ãããããŸãã éãããšã©ãŒãçºçããŸã ãšããšã³ã ïŒããã¡ã€ã«ãŸãã¯ãã£ã¬ã¯ããªãèŠã€ãããŸãããïŒéãããšããŠããŸã config.json ã¯ããããã«æ§æãã¡ã€ã«ã眮ãå¿ èŠããããŸãã
ããã¯åãªãäŸã§ãããç§ã¯90ïŒ ã®ç¢ºçã§ ã¹ãã©ã¹ãããããé£ããããšã¯äœããããŸããã以äžã¯å®å šãªã¹ããããã€ã¹ãããã®ãããã° ã¬ã€ãã§ãã
- ããã°ã©ã ããã®ææ§ãªã·ã¹ãã ãšã©ãŒã¡ãã»ãŒãžã«ã€ã©ã€ã©
- ããã°ã©ã ãåèµ·åãã ã¹ãã©ã¹
- ãã¬ãŒã¹çµæã§ãšã©ãŒã¡ãã»ãŒãžãèŠã€ãã
- æåã®å€±æããã·ã¹ãã ã³ãŒã«ã«å°éãããŸã§ãããã«äžã«é²ã¿ãŸã
ã¹ããã 4 ã®ã·ã¹ãã ã³ãŒã«ã§äœãåé¡ã ã£ããããããå¯èœæ§ãéåžžã«é«ããªããŸãã
ãã³ã
ããè€éãªãããã°ã®äŸã瀺ãåã«ãããã广çã«äœ¿çšããããã®ããã€ãã®ã³ãã玹ä»ããŸãã ã¹ãã©ã¹:
ç·ã¯ããªãã®åéã§ã
å€ãã®*nixã·ã¹ãã ã§ã¯ãã«ãŒãã«ãžã®ã·ã¹ãã ã³ãŒã«ã®å®å šãªãªã¹ãã¯ã以äžãå®è¡ããããšã§ååŸã§ããŸãã man ã·ã¹ãã ã³ãŒã«ã次ã®ãããªãã®ãèŠãããŸã ãã¬ãŒã(2)ãå®è¡ããããšã§ããå€ãã®æ å ±ãåŸãããšãã§ããŸãã ç·2BRK.
å°ããªèœãšã穎: ç·2ãã©ãŒã¯ ã·ã§ã«ã®ããŒãžã衚瀺ããŸã ãã©ãŒã¯ïŒïŒ в GNUã©ã€ãã©ãªã¯ãåŒã³åºãã«ãã£ãŠå®è£ ãããŸãã ã¯ããŒã³ïŒïŒãåŒã³åºãã»ãã³ãã£ã¯ã¹ ãã©ãŒã¯ 䜿çšããããã°ã©ã ãæžããŠãåãã§ã ãã©ãŒã¯ïŒïŒãã¬ãŒã¹ãå®è¡ãããšãåŒã³åºãã¯èŠã€ãããŸãã ãã©ãŒã¯ã代ããã« ã¯ããŒã³ïŒïŒããã®çš®ã®ã¬ãŒãã¯ããœãŒã¹ãšåºåãæ¯èŒãå§ãããšæ··ä¹±ããã ãã§ã ã¹ãã©ã¹.
åºåããã¡ã€ã«ã«ä¿åããã«ã¯ -o ã䜿çšããŸãã
ã¹ãã©ã¹ åºç¯ãªåºåãçæãããå¯èœæ§ãããããããã¬ãŒã¹çµæãå¥ã ã®ãã¡ã€ã«ã«ä¿åãããšäŸ¿å©ãªå ŽåããããŸã (äžèšã®äŸã®ããã«)ããŸããããã°ã©ã ã®åºåãšåºåãæ··åããªãããã«ããã®ã«ã圹ç«ã¡ãŸã ã¹ãã©ã¹ ã³ã³ãœãŒã«ã§ã
ããå€ãã®åŒæ°ããŒã¿ã衚瀺ããã«ã¯ã-s ã䜿çšããŸãã
äžèšã®ãã¬ãŒã¹ããã¯äŸã§ã¯ããšã©ãŒ ã¡ãã»ãŒãžã®åŸåéšåã衚瀺ãããŠããªãããšã«ãæ°ã¥ããããããŸããããã㯠ã¹ãã©ã¹ ããã©ã«ãã§ã¯ãæåååŒæ°ã®æåã® 32 ãã€ãã®ã¿ã衚瀺ãããŸãããã£ãšèŠããå Žåã¯ã次ã®ããã«è¿œå ããŠãã ãã -s 128 ææŠã« ã¹ãã©ã¹.
- ãã¡ã€ã«ããœã±ãããªã©ã®è¿œè·¡ã容æã«ãªããŸãã
ããã¹ãŠããã¡ã€ã«ããšã¯ã*nix ã·ã¹ãã ãããã¡ã€ã«ããããã¯ãŒã¯ããŸãã¯ããã»ã¹éãã€ããžã® I/O ã®ãããã§ãã£ãŠãããã¡ã€ã«èšè¿°åã䜿çšããŠãã¹ãŠã® I/O ãå®è¡ããããšãæå³ããŸããããã¯ããã°ã©ãã³ã°ã«ã¯äŸ¿å©ã§ãããäžè¬çãªãã®ãèŠããšå®éã«äœãèµ·ãã£ãŠããã®ãææ¡ããã®ãé£ãããªããŸãã read О æžããŸã ã·ã¹ãã ã³ãŒã«ãã¬ãŒã¹çµæã«è¡šç€ºãããŸãã
æŒç®åã远å ããããšã§ ãããããªãã¯åŒ·å¶ããã§ããã ã¹ãã©ã¹ åºåå ã®åãã¡ã€ã«èšè¿°åã«ããããäœãæãã®ããç€ºãæ³šéãä»ããŸãã
-p** ã䜿çšããŠãã§ã«å®è¡äžã®ããã»ã¹ã«ã¢ã¿ãããã
以äžã®äŸãããããããã«ããã§ã«å®è¡äžã®ããã°ã©ã ããã¬ãŒã¹ããå¿ èŠãããå ŽåããããŸããããã»ã¹1337ãšããŠå®è¡ãããŠããããšãåãã£ãŠããå ŽåïŒåºåãã psïŒã®å Žåã¯ã次ã®ããã«ãã¬ãŒã¹ã§ããŸãã
$ strace -p 1337
...system call trace output...ã«ãŒãã¢ã¯ã»ã¹ãå¿ èŠã«ãªãå ŽåããããŸãã
åããã»ã¹ãç£èŠããã«ã¯ -f ã䜿çšããŸã
ã¹ãã©ã¹ ããã©ã«ãã§ã¯ã1 ã€ã®ããã»ã¹ã®ã¿ããã¬ãŒã¹ããŸãããã®ããã»ã¹ãåããã»ã¹ãçæããå Žåãåããã»ã¹ãçæããã·ã¹ãã ã³ãŒã«ã¯è¡šç€ºãããŸãããåããã»ã¹ã®ã·ã¹ãã ã³ãŒã«ã¯è¡šç€ºãããŸããã
ãšã©ãŒãåããã»ã¹ã«ãããšæãããå Žåã¯ãæŒç®åã䜿çšããŸãã -fããã«ããããã¬ãŒã¹ãå¯èœã«ãªããŸãããã®æ¹æ³ã®æ¬ ç¹ã¯ãçµè«ãããªããããã«æ··ä¹±ãããã ãã ãšããããšã§ããã〠ã¹ãã©ã¹ åäžã®ããã»ã¹ãŸãã¯ã¹ã¬ããããã¬ãŒã¹ãããšãåŒã³åºãã€ãã³ãã®åäžã®ãããŒã衚瀺ãããŸããè€æ°ã®ããã»ã¹ãäžåºŠã«ãã¬ãŒã¹ãããšãã¡ãã»ãŒãžã«ãã£ãŠé話ã®éå§ãäžæãããããšããããŸãã ããã®åŸãä»ã®å®è¡ãã©ã³ããžã®åŒã³åºããç¶ããæåã®ãã©ã³ãã®çµäºãè¡ãããŸãã <⊠foocall ãåéãããŸãã>ããŸãã¯ãæŒç®åã䜿çšããŠãã¹ãŠã®ãã¬ãŒã¹çµæãå¥ã®ãã¡ã€ã«ã«åå²ããããšãã§ããŸãã -ff ïŒè©³çŽ°ã¯ äžã® ã¹ãã©ã¹).
-eã§ãã¬ãŒã¹ããã£ã«ã¿ãªã³ã°ãã
ã芧ã®ãšããããã¬ãŒã¹çµæã¯ããã¹ãŠã®å¯èœãªã·ã¹ãã ã³ãŒã«ã®å®éã®ããŒãã§ãããã©ã° -e ãã¬ãŒã¹ããã£ã«ã¿ãªã³ã°ããããšãã§ããŸãïŒ äžã® ã¹ãã©ã¹ïŒãäž»ãªå©ç¹ã¯ããã£ã«ã¿ãªã³ã°ããããã¬ãŒã¹ãå®è¡ãããšãå®å šãªãã¬ãŒã¹ãå®è¡ãããããé«éã«ãªãããšã§ãã grep`ã§ãæ£çŽã«èšããšãç§ã¯ã»ãšãã©æ°ã«ããŸããã
ãã¹ãŠã®ééããæªãããã§ã¯ãªã
åçŽã§äžè¬çãªäŸãšããŠã¯ãå®è¡å¯èœãã¡ã€ã«ãå«ããã£ã¬ã¯ããªãæ€çŽ¢ããã·ã§ã«ã®ããã«ãäžåºŠã«è€æ°ã®å Žæã§ãã¡ã€ã«ãæ€çŽ¢ããããã°ã©ã ããããŸãã
$ 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 ã§äœãã©ã®ããã«è¡ãããå°ãã§ãçè§£ããŠããã°ãã·ã¹ãã ã³ãŒã« ãã¬ãŒã¹ã®çµæãçè§£ãããããªããŸããäŸãã°ããããã¯ãŒã¯ã·ã¹ãã ãžã®åŒã³åºãã®ãããã°ã«åé¡ãããå Žåã¯ãåãå€å žç㪠.
ããè€éãªãããã°ã®äŸ
ãã§ã«è¿°ã¹ãããã«ããã®ç°¡åãªãããã°ã®äŸã¯ãç§ãäœæ¥ããéã«äž»ã«å¯ŸåŠããªããã°ãªããªãäŸã§ãã ã¹ãã©ã¹ããã ããå®éã®èª¿æ»ãå¿ èŠã«ãªãå Žåããããããããã§ã¯ããå°ãè€éãªãããã°ã®å®éã®äŸã瀺ããŸãã
â ã¿ã¹ã¯ ã¹ã±ãžã¥ãŒã©ã*nix ããŒã¢ã³ã®å¥ã®å®è£ cronããµãŒããŒã«ã€ã³ã¹ããŒã«ãããŠããŸããã誰ããã¹ã±ãžã¥ãŒã«ãç·šéããããšãããšã次ã®ããã«ãªããŸãã
# crontab -e -u logs
bcrontab: Fatal: Could not create temporary fileã§ã¯ã bcron ç¹å®ã®ãã¡ã€ã«ãæžã蟌ãããšããããããŸããããªãã£ããããã®çç±ãèªããããšããªãã鿢±ããŠã¿ãŸããã ã¹ãã©ã¹:
# 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 ã€ãããŸãã éã äžçªäžã« ãœã±ãã éäžã§ã éã ãã¡ã€ã«ãéãã éããïŒïŒïŒãã®åŸãåã³éããŠããããšã衚瀺ãããŸãã (Rake: ãã¡ã€ã«èšè¿°åã¯ãéãããéããããããšãã«åå©çšã§ããŸãã) ãœã±ããïŒïŒ æåŸã®ãã®ãªã®ã§ãŽã£ããã§ã èªãã ïŒïŒãããŠãbcrontab ã¯ãœã±ãããä»ããŠäœããšé£æºããããšãããããŸãããæ¬¡ã®è¡ã¯ããã¡ã€ã«èšè¿°åã UNIXãã¡ã€ã³ãœã±ãã éäžã§ /var/run/bcron-spool.
ããã§ãç§ãã¡ã¯ã UNIXãœã±ãã å察åŽã«ããã®ç®çã«ã¯ãããã€ãã®å·§åŠãªããªãã¯ããããã©ã¡ãããµãŒããŒã®å±éã®ãããã°ã«åœ¹ç«ã¡ãŸãã 1ã€ç®ã¯ netstat ãŸãã¯ãã以é ss (ãœã±ããã¹ããŒã¿ã¹)ãã©ã¡ãã®ã³ãã³ããã·ã¹ãã ã®ã¢ã¯ãã£ããªãããã¯ãŒã¯æ¥ç¶ã衚瀺ãããªãã¬ãŒã¿ -l ãªã¹ãã³ã°ãœã±ãããšãªãã¬ãŒã¿ãèšè¿°ãã -p ãœã±ããã«ã¯ã©ã€ã¢ã³ããšããŠæ¥ç¶ãããŠããããã°ã©ã ã衚瀺ããŸãã (ä»ã«ã䟿å©ãªãªãã·ã§ã³ã¯ãããããããŸããããã®ã¿ã¹ã¯ã«ã¯ããã 2 ã€ã§ååã§ãã)
# 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 ããœã±ãããšããŠäœ¿çšããŠããŸãã)
åãæ å ±ãèŠã€ããã®ã«æ¬åœã«äŸ¿å©ãª2çªç®ã®ããŒã«ã¯ lsofãã·ã¹ãã äžã§éããŠãããã¹ãŠã®ãã¡ã€ã« (ãŸãã¯ãã¡ã€ã«èšè¿°å) ãäžèŠ§è¡šç€ºããŸãããŸãã¯ãç¹å®ã®ãã¡ã€ã«ã«é¢ããæ å ±ãååŸããããšãã§ããŸãã
# 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/ãã¬ãŒã¹ -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/ã¹ããŒã«.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 +++ïŒè¿·ã£ãããååã®æçš¿ãèªãã§ã¿ãŠãã ãã ) ãã®ããããµãŒããŒPID 20629ã«ã¯ãã¹ã«ãã¡ã€ã«ãäœæããæš©éããããŸããã§ããã /var/spool/cron/tmp/spool.21470.1573692319.854640ãããããããã®çç±ã¯åŸæ¥ã®ãã¡ã€ã« ã·ã¹ãã ã®ã¢ã¯ã»ã¹èš±å¯èšå®ã«ãããŸãã確èªããŠã¿ãŸããã:
# 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/spool/cron/tmp/ãã·ã³ãã«ãªã³ãã³ã chown cron /var/spool/cron/tmp/ äœãäºå®ã§ã bcron æ£åžžã«åäœããŸããïŒãããåé¡ã§ãªãå Žåãæ¬¡ã«çãããã®ã¯ SE ã«ãŒãã« ã»ãã¥ãªã㣠ã¢ãžã¥ãŒã«ã§ããïŒLinux ãŸãã¯AppArmorãªã®ã§ãã«ãŒãã«ã¡ãã»ãŒãžãã°ã確èªããŸãã dmesg.)
åèšã§
åå¿è ã«ãšã£ãŠãã·ã¹ãã ã³ãŒã« ãã¬ãŒã¹ã®åºåã¯å§åçãªãã®ã«ãªãå¯èœæ§ããããŸãããäžè¬çãªãããã€ã¡ã³ãã®åé¡å šäœããããã°ããããã®ç°¡åãªæ¹æ³ã§ããããšã瀺ãããšæããŸãããã«ãããã»ã¹ã®ãããã°ãæ³åããŠã¿ãŠãã ãã bcronã¹ããããã€ã¹ãããã®ãããã¬ãŒã䜿çšããŸãã
ãã¬ãŒã¹çµæãã·ã¹ãã ã³ãŒã«ãã§ãŒã³ã«æ²¿ã£ãŠè§£æããã«ã¯ã¹ãã«ãå¿ èŠã§ãããåè¿°ããããã«ãã»ãšãã©ã®å Žåã ã¹ãã©ã¹ãã¬ãŒã¹çµæãååŸããæåŸãããšã©ãŒãæ¢ãã ãã§ãããšãããã ã¹ãã©ã¹ ãããã°ã«ãããââæéãå€§å¹ ã«ç¯çŽã§ããŸããããªãã«ãšã£ãŠã圹ç«ã€ããšãé¡ã£ãŠããŸãã
åºæïŒ habr.com
