ืืขืืืื ืืืื ืฉืื ืืื ืืขืืงืจ ืคืจืืกืช ืชืืื ื, ืื ืฉืืืืจ ืฉืื ื ืืืื ืืจืื ืืื ืื ืืกืืื ืืขื ืืช ืขื ืฉืืืืช ืืื:
- ืืชืืื ื ืืื ืขืืืืช ืขืืืจ ืืืคืชื, ืืื ืื ืขืืืจื. ืืื?
- ืืชืืื ืืชืืื ื ืืื ืขืืื ืืฉืืืื, ืืื ืืืื ืื ืื. ืืื?
ืืื ืกืื ืฉื ืืืชืืจ ืืืืื ืืฉืื ื ืืืงืฆืช ืืืืชืืจ ืืืืื ืจืืื ืืชืืื ื. ืืืชืืจ ืืืืื ืจืืื ืขืืกืง ืืืืืืื ืฉื ืืงืื, ืืื ืืืชืืจ ืืืืื ืืคืจืืกื ืขืืกืง ืืืื ืืจืืงืฆืื ืืื ืืงืื ืืกืืืื. ืื ืื ืฉืืจืฉ ืืืขืื ืืื ืฉืืืื ืืืืืช, ืืขืืืื ืฉืืื ืขืืื ืขื ืืืื ื ืืืช ืืื ืขื ืืืจืช ืืืืจืช ืฉืืืขืื ืืื ืืืืฉืื ืืกืืืื.
ืื ืืืงืื ืืื ื ืืคืื ืืืืื ืืจืืืืื ืืื 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 ืขืืืจ ืืืืช ืืขืจืืช ืืืคืขืื. ืคืขื, ืืชืืื ื ืืืืชื ืืืฉื ืืฉืืจื ืืืืืจื ืฉืืื ืจืฆื ืขืืื. ืื, ืืืฉื, ืืื ืืื ืฆืจืื ืืืฆืื ืืฉืื ืขื ืืืกื, ืืื ืฉืืืง ืขื ืืฆืืืืช ืื ืืืืจืื ืืืืคื ืืืืจืื ืขืืืจ ืืชืงื ื ืืืืื. ืืืฉืจ ืืขืจืืืช ืืืฉื ืจืืืื ืืฉืืืืช ืืคืื ืคืืคืืืจืืืช, ืืืืก ืฉืื ืืืฉืจ ืืืฉืืืื ืฉืื ืื ื ืืืื ืขื ืืืืืจื. ืฉืืืืืช ืืืืฉืื ืืื ืขืืืืืช ืืืคืื ืืืจืื, ืื ืื ืืช ืืืขืจืืช ืืืื. ืื ืืืคืืขื ืืฆืื ืืจืฉืืืช (ืื "ืืื ืช ืืืขืช") ืืืขืื. ืืงืจื ื ืืคื ืืืืืืก ืืืืชืจ: ืืื ืงืืื ืืืฉื ืืืื ืืืืืจื, ืืืืืื ืืืฉืืืื ืคืืืช ืืืืืกืื ืฉืืืจ ืืื ืฆืจืืืื ืืืงืฉ ืืืฉื ืืืงืจื ื ืืื ืืงืืื ืืื ืืจืืงืฆืื ืขื ืืืืืจื ืืืืฆืขืืช ืงืจืืืืช ืืขืจืืช.
ืืจืื ืืืื ืืจืืช, ืงืจืืืช ืืขืจืืช ืฉืื ื ืืืงืฆืช ืืงืจืืืช ืคืื ืงืฆืื ืคืฉืืื, ืื ืจืื ืืชืืื ืืช ืืฉืชืืฉืืช ืืืขืืคืช ืืกืคืจืืื ืืจืืืื. ืึธืึตื. ืืกืคืจืืื ืืกืื ืืจืืืช ืฉื POSIX C ืืืืื ืงืจืืืช ืคืื ืงืฆืื ืึดืืชืึนื(), ืืืืื ืืช ืื ืืงืื ืืกืคืฆืืคื ืืืจืืืืงืืืจื ืขืืืจ ืงืจืืืช ืืืขืจืืช ืืืชืื.
ืืงืืฆืืจ, ืื ืืื ืืจืืงืฆืื ืืื ืืคืืืงืฆืื ืืกืืืืชื (ืืขืจืืืช ืืืฉืื) ืืชืืฆืขืช ืืืืฆืขืืช ืงืจืืืืช ืืขืจืืช. ืืื, ืืืฉืจ ืชืืื ื ืขืืืืช ืขื ืืืฉื ืืื ืื ืื ืขื ืืืจ, ืืืื ืืื ืืืกืชืื ืขื ืชืืฆืืืช ืืขืงื ืฉืืืืช ืืืขืจืืช. ืืืชืจ ืืืืง, ืื ื ืจืฉืืื ืฉื ืจืืขืื ืืืคืืกืืื ืฉื ืืชื ืื ืชื ืืืืฆืขืืช ืืขืงื ืืืจ ืงืจืืืช ืืขืจืืช:
- ืงืื/ืคืื ืืกืืฃ
- ืงืื/ืคืื ืจืฉืช
- ืืืฉื ืืืขืจืืช ืงืืฆืื ื-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, mpprotect, BRK ืืืืจืื ืืื ืืืืื ืืืืจืื ืืจืื ื ืืืื ืืืฆืืช ืกืคืจืืืช ืืื ืืืืช.) ืืืขืฉื, ืืืืื ืืืชืืจ ืืืืื ืืคืื ืฉืืจืก ืขืืืฃ ืืงืจืื ืืืกืืฃ. ืืืื ืืชืืจ ืืืื ืืืชืื, ืฉืืฆืืื ืืืืขืช ืฉืืืื. ืื ื ืืกืชืืืื ืืืขืื ืืจืืืื ืืช ืงืจืืืช ืืืขืจืืช ืืฉืืืื ืืจืืฉืื ื - ืืงืจืืื openat, ืื ืฉืืืจืง ืฉืืืื ENOENT ("ืงืืืฅ ืื ืกืคืจืืื ืื ื ืืฆืื") ืื ืกื ืืืืคืชื /etc/foo/config.json. ืืื ืฆืจืื ืืืืืช ืงืืืฅ ืืชืฆืืจื.
ืื ืืืืชื ืจืง ืืืืื, ืืื ืืืืชื ืืืืจ 90% ืืืืื ืฉืื ื ืืฉืชืืฉ ืื ืฉืืจืก, ืืื ืืืจ ืืจืื ืืืชืจ ืงืฉื ืืขืฉืืช ืืื. ืืืื ืืืจืื ืืื ืฉืื ืืืจ ืฉืื ืื ืืคืื ืืืืื:
- ืชืชืขืฆืื ืืืื ืืืืขื ืืขืืจืคืืช ืขื ืฉืืืืช system-y ืืชืืื ืืช
- ืืคืขื ืืืืฉ ืืช ืืชืืื ืืช ืขื ืฉืืจืก
- ืืฆื ืืช ืืืืขืช ืืฉืืืื ืืชืืฆืืืช ืืืขืงื
- ืขืื ืืืื ืืืชืจ ืขื ืฉืชืคืืข ืืฉืืืช ืืืขืจืืช ืฉื ืืฉืื ืืจืืฉืื ื
ืกืืืจ ืืืื ืฉืืงืจืืื ืืืขืจืืช ืืฉืื 4 ืชืืื ืื ืืฉืชืืฉ.
ืืืคืื
ืืคื ื ืฉืืจืื ืื ืืืืื ืื ืืคืื ืืืืื ืืืจืื ืืืชืจ, ืืจืื ืื ืืื ืืจืืงืื ืืฉืืืืฉ ืืขืื ืฉืืจืก:
ืืืจ ืืื ืืืจ ืฉืื
ืืืขืจืืืช *nix ืจืืืช, ื ืืชื ืืงืื ืจืฉืืื ืืืื ืฉื ืงืจืืืืช ืืขืจืืช ืืงืจื ื ืขื ืืื ืืคืขืื ืืืจ ืืชืงืฉืจ. ืืชื ืชืจืื ืืืจืื ืืื brk(2), ืืืืืจ ื ืืชื ืืงืื ืืืืข ื ืืกืฃ ืขื ืืื ืืคืขืื ืืืจ 2 ืืจืง.
ืืืจืคื ืงืื ื: ืืืื ืืืจ 2 ืืจืื ืื ืืช ืืืฃ ืฉื ืืงืืืคื ืืืื() ะฒ GNU libc, ืืฉืจ, ืืกืชืืจ, ืืืืฉื ืขื ืืื ืงืจืืื ืฉืืืื (). ืืชืงืฉืจ ืืกืื ืืืงื ืืืื ื ืฉืืจ ืืื ืื ืืชื ืืืชื ืชืืื ืืช ืืืืฆืขืืช ืืืื(), ืืืคืขื ืืขืงื - ืื ืืืฆื ืฉืืืืช ืืืื, ืืืงืืื ืืืื ืฉืืืื (). ืืืจืคืืช ืืืื ืจืง ืืืืืืืช ืืืชื ืื ืืชื ืืชืืื ืืืฉืืืช ืืช ืืืงืืจ ืขื ืืคืื ืฉืืจืก.
ืืฉืชืืฉ ื-o ืืื ืืฉืืืจ ืืช ืืคืื ืืงืืืฅ
ืฉืืจืก ืืืื ืืืฆืืจ ืคืื ื ืจืื, ืืืื ืืจืื ืฉืืืืฉื ืืืืกื ืชืืฆืืืช ืืขืงื ืืงืืฆืื ื ืคืจืืื (ืืื ืืืืืื ืืืขืื). ืื ืื ืขืืืจ ืืื ืืข ืืืืื ืืื ืคืื ืชืืื ืืช ืืคืื ืฉืืจืก ืืงืื ืกืืื.
ืืฉืชืืฉ ื-s ืืื ืืืฆืื ืืืชืจ ื ืชืื ื ืืจืืืื ืืื
ืืืื ืฉืืชื ืื ืฉืืืฆื ืืฉื ื ืฉื ืืืืขืช ืืฉืืืื ืืื ื ืืืฆื ืืืขืงื ืืืืืื ืฉืืืขืื. ืื ืืืื ืฉืืจืก ืืจืืจืช ืืืืื ืืฆืืื ืจืง ืืช 32 ืืืชืื ืืจืืฉืื ืื ืฉื ืืจืืืื ื ืืืืจืืืช. ืื ืืชื ืจืืฆื ืืจืืืช ืขืื, ืืืกืฃ ืืฉืื ืืื -ืฉ 128 ืืฉืืื ืฉืืจืก.
-y ืืงื ืขื ืืขืงื ืืืจ ืงืืฆืื, ืฉืงืขืื ืืื'.
"ืืื ืืื ืงืืืฅ" ืคืืจืืฉื ืฉืืขืจืืืช *nix ืขืืฉืืช ืืช ืื ื-I/O ืืืืฆืขืืช ืืชืืจื ืงืืฆืื, ืืื ืื ืื ืื ืขื ืงืืืฅ ืื ืจืฉืช ืื ืฆืื ืืจืืช ืืื-ืชืืืืืื. ืื ื ืื ืืชืื ืืช, ืืื ืืงืฉื ืืขืงืื ืืืจ ืื ืืืืช ืงืืจื ืืฉืืชื ืจืืื ืืฉืืชืฃ ืืงืจืื ะธ ืืืชืื ืืชืืฆืืืช ืืขืงื ืฉืืืืช ืืืขืจืืช.
ืขื ืืื ืืืกืคืช ืืืคืจืืืจ ืื, ืืชื ืชืืจืื ืฉืืจืก ืกืื ืื ืืชืืจ ืงืืืฅ ืืคืื ืขื ืืขืจื ืฉื ืื ืืื ืืฆืืืข.
ืฆืจืฃ ืืชืืืื ืฉืืืจ ืคืืขื ืืืืฆืขืืช -p**
ืืคื ืฉืชืจืื ืืืืืืื ืืืื, ืืคืขืืื ืืชื ืฆืจืื ืืืชืืงืืช ืืืจ ืชืืื ืืช ืฉืืืจ ืคืืขืืช. ืื ืืืืข ืฉืืื ืคืืขื ืืชืืืื 1337 (ื ื ืื ืืืคืื ps), ืื ืืชื ืืืื ืืขืงืื ืืืจืื ืื:
$ strace -p 1337
...system call trace output...
ืืืชืื ืฉืชืฆืืจื ืืืืืืช ืฉืืจืฉ.
ืืฉืชืืฉ ื-f ืืื ืืคืงื ืขื ืชืืืืื ืฆืืฆื
ืฉืืจืก ืืืจืืจืช ืืืื, ืืื ืขืืงื ืืืจ ืชืืืื ืืื ืืืื. ืื ืชืืืื ืื ืืืืื ืชืืืืื ืฆืืฆื, ื ืืชื ืืจืืืช ืืช ืงืจืืืช ืืืขืจืืช ืืืืืื ืืช ืชืืืื ืืฆืืฆื, ืื ืงืจืืืืช ืืืขืจืืช ืฉื ืชืืืื ืืฆืืฆื ืื ืืืฆืื.
ืื ืืชื ืืืฉื ืฉืืฉืืืื ืืื ืืชืืืื ืฆืืฆื, ืืฉืชืืฉ ืืืฆืืจื -f, ืื ืืืคืฉืจ ืืช ืืืขืงื ืฉืื. ืืืืกืจืื ืืื ืืื ืฉืืคืื ืืืืื ืืืชื ืขืื ืืืชืจ. ืืชื ืฉืืจืก ืขืืงื ืืืจ ืชืืืื ืืื ืื ืฉืจืฉืืจ ืืื, ืืื ืืฆืื ืืจื ืืืื ืฉื ืืืจืืขื ืฉืืื. ืืืฉืจ ืืื ืขืืงื ืืืจ ืชืืืืืื ืืจืืืื ืื-ืืื ืืช, ืืืชืื ืฉืชืจืื ืืช ืชืืืืชื ืฉื ืฉืืื ืืืคืจืขืช ืขื ืืื ืืืืขื , ืืื - ืฆืจืืจ ืงืจืืืืช ืืขื ืคื ืืืฆืื ืืคืืขื ืืืจืื, ืืจืง ืื - ืกืืฃ ืืจืืฉืื <...ืฉืืืช ืคืืงื ืืชืืืฉื>. ืื ืืคืฆื ืืช ืื ืชืืฆืืืช ืืืขืงื ืืงืืฆืื ืฉืื ืื, ืื ืืืืฆืขืืช ืืืืคืจืืืจ -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
ืืกืืจ, ืื ืืืืจ 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 +++
ืืฉ ืืืืขืช ืฉืืืื ืืืฉ ืืงืจืืช ืืกืืฃ ืืืชืื, ืืื ืืคืขื ืืฉืื ืฉืื ื. ืจืืฉืืช, ืืื ืฉืืืืช ืงืจืืืช ืืขืจืืช ืจืืืื ืืืช, ืฉืืืจื ืืื ืืชืจืืฉืช ืืคื ื ืื. ืฉื ืืช, ืืจืืจ ืฉืืืคืฉืื ืืืฉืื ืืืจ ืงืจื ืืช ืืืืขืช ืืฉืืืื. ื ืจืื ืฉืืืขืื ืืืืืชืืช ืืื ืืืงืื ืืืจ, ื bcrontab ืคืฉืื ืืฉืืืข ืืช ืืืืืขื.
ืื ืืชื ืืกืชืื ืขื ืืืจ 2 ืงืจื, ืืชื ืืืื ืืจืืืช ืฉืืืจืืืื ื ืืจืืฉืื (3) ืืื ืืชืืจ ืงืืืฅ, ืฉ-*nix ืืฉืชืืฉ ืื ืขืืืจ ืื ืขืืืืื I/O. ืืืฆื ืืืื ืืืืืช ืื ืืืืฆื ืืชืืจ ืงืืืฅ 3? ืืืงืจื ืืกืคืฆืืคื ืืื, ืืชื ืืืื ืืจืืฅ ืฉืืจืก ืขื ืืคืขืื ืื (ืจืื ืืืขืื) ืืื ืืกืคืจ ืื ืืืืคื ืืืืืืื, ืืื ืืื ืืืืื ืืืจืื ืืืื, ืืืื ืืืขืช ืืื ืืงืจืื ืืื ืชื ืชืืฆืืืช ืืขืงื.
ืืืงืืจ ืฉื ืืชืืจ ืงืืืฅ ืืืื ืืืืืช ืงืจืืืืช ืืขืจืืช ืืืช ืืื ื ืจืืืช (ืืื ืชืืื ืืื ืืืืขื ืืืชืืจ - ืงืื ืกืืื, ืฉืงืข ืจืฉืช, ืืงืืืฅ ืขืฆืื ืื ืืฉืื ืืืจ), ืืื ืืื ืื ืื ืืืื, ืื ืื ื ืืืคืฉืื ืฉืืืืช ืขื ืืื ืืืืจืช 3 (ืืืืืจ, ืื ื ืืืคืฉืื "= 3" ืืชืืฆืืืช ืืืขืงื). ืืชืืฆืื ืื ืืฉ 2 ืืื: openat ืืืืง ืืขืืืื ื ืฉืงืข ืืืืฆืข. openat ืคืืชื ืืช ืืงืืืฅ ืืื close(3) ืื ืืจืื ืฉืืื ื ืกืืจ ืฉืื. (ืืจืคื: ื ืืชื ืืขืฉืืช ืฉืืืืฉ ืืืืจ ืืชืืืืจื ืงืืฆืื ืืืฉืจ ืื ื ืคืชืืื ืืกืืืจืื). ืฉืึดืืึธื ืฉืงืข () ืืชืืื ืื ืื ืืืืจืื ืืคื ื ืืงืจืื(), ืืืกืชืืจ ืฉ-bcrontab ืขืืื ืขื ืืฉืื ืืจื ืฉืงืข. ืืฉืืจื ืืืื ืืจืื ืฉืืชืืจ ืืงืืืฅ ืืฉืืื ืืืื ืฉืงืข ืืืืืื ืฉื ืืื ืืงืก ืืืจื /var/run/bcron-spool.
ืื, ืื ืื ื ืฆืจืืืื ืืืฆืื ืืช ืืชืืืื ืืงืฉืืจ ืืืื ืฉืงืข ืืื ืืงืก ืืฆื ืืฉื ื. ืืฉ ืืื ืืจืืงืื ืืกืืืจืื ืืืืจื ืื, ืฉื ืืื ืฉืืืืฉืืื ืืืืชืืจ ืืืืื ืืคืจืืกืืช ืฉืจืชืื. ืืจืืฉืื ืืื ืืืฉืชืืฉ netstat ืื ืืืฉ ืืืชืจ ss (ืกืืืืก ืฉืงืข). ืฉืชื ืืคืงืืืืช ืืฆืืืืช ืืช ืืืืืจื ืืจืฉืช ืืคืขืืืื ืฉื ืืืขืจืืช ืืืืงืืืช ืืช ืืืฆืืจื -l ืืชืืืืจ ืฉืงืขื ืืืื ื, ืืื ืื ืืช ืืืคืขืื -p ืืื ืืืฆืื ืชืืื ืืืช ืืืืืืจืืช ืืฉืงืข ืืืงืื. (ืืฉื ื ืืคืฉืจืืืืช ืฉืืืืฉืืืช ืจืืืช ื ืืกืคืืช, ืื ืฉืชื ืืื ืืกืคืืงืืช ืืืฉืืื ืื.)
# ss -pl | grep /var/run/bcron-spool
u_str LISTEN 0 128 /var/run/bcron-spool 1466637 * 0 users:(("unixserver",pid=20629,fd=3))
ืื ืืจืื ืฉืืืืืื ืืื ืืคืงืืื inixserver, ืคืืขื ืขื ืืืื ืชืืืื 20629. (ืืืืงืจื, ืืื ืืฉืชืืฉ ืืืชืืจ ืงืืืฅ 3 ืืชืืจ ืืฉืงืข.)
ืืืื ืืฉื ื ืืืืช ืฉืืืืฉื ืืืฆืืืช ืืืชื ืืืืข ื ืงืจื ืืกืืฃ. ืื ืืคืจื ืืช ืื ืืงืืฆืื ืืคืชืืืื (ืื ืืชืืจื ืืงืืฆืื) ืืืขืจืืช. ืื ืฉืืชื ืืืื ืืงืื ืืืืข ืขื ืงืืืฅ ืกืคืฆืืคื ืืื:
# 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
(ืืืจืื ืึฐืงึทืึผึตื() ืื ืืืฉืื ืืขืช ืืืขืงื.) ืฉืื, ืืืจืื ืืฆืขืจ, ืชืืฆืื ืื ืืื ื ืืืืื ืืช ืืฉืืืื ืฉืื ื ืืืคืฉืื. ืื ืื ื ืื ืจืืืื ืืืืขืืช ืฉ-bcrontag ืฉืืื ืื ืืงืื ืืืฉืงืข. ืืืงืื ืืืช, ืฉืืืื ืืืื ืืชืืืื (ืืฉืื, 4, SIGCHLD ืืื') ืชืืืื ืื ืืืืื ืชืืืื ืืื, ืฉืืคื ืฉื ืืชื ืื ืืฉ, ืขืืฉื ืืช ืืขืืืื ืืืืืชืืช. ืืื ืืชื ืฆืจืื ืืชืคืืก ืืช ืขืงืืืชืื, ืืืกืืคื ืืฉืืื 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
ืฉื ืงืืืจ ืืืื! ืืฉืจืช ืคืืขื ืืงืจืื ืืฉืชืืฉ, ืื ืจืง ืืฉืืจืฉ ืืฉ ืืจืฉืื ืืืชืื ืืกืคืจืืื /var/spool/cron/tmp/. ืคืงืืื ืคืฉืืื chown cron /var/spool/cron/tmp/ ืืืืฅ bcron ืืขืืื ื ืืื. (ืื ืื ืื ืืืืชื ืืืขืื, ืื ืืืฉืื ืืื ืืกืืืจืืช ืืืืื ืืื ืืืืื ืืืืืช ืืืื ืืื SELinux ืื AppArmor, ืื ืืืืชื ืืืืง ืืช ืืืื ืืืืขืืช ืืืืื ืขื dmesg.)
ืืกื ืืื
ืืขืงื ืืืจ ืงืจืืืืช ืืขืจืืช ืืืื ืืืืืช ืืืจืืข ืขืืืจ ืืชืืืืื, ืืื ืื ื ืืงืืื ืฉืืจืืืชื ืฉืื ืืจื ืืืืจื ืื ืคืืช ืืืืื ืืืืงื ืฉืืื ืฉื ืืขืืืช ืคืจืืกื ื ืคืืฆืืช. ืชืืจื ืืขืฆืืื ืฉืืชื ืื ืกืื ืืืชืจ ืืืืื ืืจืืืื ืชืืืืืื bcronืืืืฆืขืืช ืืืชืจ ืืืืื ืฉืื ืืืจ ืฉืื.
ื ืืชืื ืชืืฆืืืช ืขืงืืืช ืืืืืจ ืืืืจื ืฉืจืฉืจืช ืฉืืืืช ืืืขืจืืช ืืืจืฉ ืืืืื ืืช, ืืื ืืคื ืฉืืืจืชื, ืืืขื ืชืืื, ืฉืืืืฉ ืฉืืจืก, ืื ื ืคืฉืื ืืงืื ืืช ืชืืฆืืช ืืืขืงื ืืืืคืฉ ืฉืืืืืช ืืื ืืืกืืฃ. ืืื ืืงืจื, ืฉืืจืก ืขืืืจ ืื ืืืกืื ืืจืื ืืื ืื ืืคืื ืืืืื. ืื ื ืืงืืื ืฉืื ืืืื ืฉืืืืฉื ืื ืื.
ืืงืืจ: www.habr.com