์ ๊ฐ ํ๋ ์ผ์ ๋๋ถ๋ถ ์ํํธ์จ์ด ๋ฐฐํฌ์ ๋๋ค. ์ฆ, ๋ค์๊ณผ ๊ฐ์ ์ง๋ฌธ์ ๋ต๋ณํ๋ ๋ฐ ๋ง์ ์๊ฐ์ ๋ณด๋ ๋๋ค.
- ์ด ์ํํธ์จ์ด๋ ๊ฐ๋ฐ์์๊ฒ๋ ์๋ํ์ง๋ง ๋์๊ฒ๋ ์๋ํ์ง ์์ต๋๋ค. ์?
- ์ด์ ๋ ์ด ์ํํธ์จ์ด๊ฐ ์ ๊ฒ ํจ๊ณผ๊ฐ ์์์ง๋ง ์ค๋์ ๊ทธ๋ ์ง ์์ต๋๋ค. ์?
์ด๋ ์ผ๋ฐ์ ์ธ ์ํํธ์จ์ด ๋๋ฒ๊น ๊ณผ ์ฝ๊ฐ ๋ค๋ฅธ ์ผ์ข ์ ๋๋ฒ๊น ์ ๋๋ค. ์ผ๋ฐ ๋๋ฒ๊น ์ ์ฝ๋์ ๋ ผ๋ฆฌ์ ๊ดํ ๊ฒ์ด์ง๋ง ๋ฐฐํฌ ๋๋ฒ๊น ์ ์ฝ๋์ ํ๊ฒฝ ๊ฐ์ ์ํธ ์์ฉ์ ๊ดํ ๊ฒ์ ๋๋ค. ๋ฌธ์ ์ ๊ทผ๋ณธ ์์ธ์ด ๋ ผ๋ฆฌ์ ์ค๋ฅ์ธ ๊ฒฝ์ฐ์๋ ๋ชจ๋ ๊ฒ์ด ํ ์์คํ ์์๋ ์๋ํ๊ณ ๋ค๋ฅธ ์์คํ ์์๋ ์๋ํ์ง ์๋๋ค๋ ์ฌ์ค์ ๋ฌธ์ ๊ฐ ํ๊ฒฝ์ ์๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
๋ฐ๋ผ์ ๋ค์๊ณผ ๊ฐ์ ์ผ๋ฐ์ ์ธ ๋๋ฒ๊น ๋๊ตฌ ๋์ 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์ ๋น์ทํฉ๋๋ค. ์๋ ์์ ์๋ ์ํํธ์จ์ด๊ฐ ์คํ๋๋ ํ๋์จ์ด์ ์ง์ ์ก์ธ์คํ ์ ์์์ต๋๋ค. ์๋ฅผ ๋ค์ด ํ๋ฉด์ ๋ฌด์ธ๊ฐ๋ฅผ ํ์ํด์ผ ํ๋ ๊ฒฝ์ฐ ๋น๋์ค ์ฅ์น์ฉ ํฌํธ๋ ๋ฉ๋ชจ๋ฆฌ ๋งคํ๋ ๋ ์ง์คํฐ๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์๋์์ต๋๋ค. ๋ฉํฐํ์คํน ์ปดํจํฐ ์์คํ ์ด ๋์คํ๋์ ๋ค์ํ ์์ฉ ํ๋ก๊ทธ๋จ์ด ํ๋์จ์ด๋ฅผ ๋๊ณ ์ธ์ฐ๋ฉด์ ํผ๋์ด ๋ฅ์ณค์ต๋๋ค. ํ ์์ฉ ํ๋ก๊ทธ๋จ์ ์ค๋ฅ๋ก ์ธํด ์ ์ฒด ์์คํ ์ ์๋๋๋ผ๋ ๋ค๋ฅธ ์์ฉ ํ๋ก๊ทธ๋จ์ด ์ค๋จ๋ ์ ์์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ๊ถํ ๋ชจ๋(๋๋ "๋ง ๋ณดํธ")๊ฐ 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, ์ ํ๋กํ ํธ, BRK ๋ฎ์ ์์ค์ ๋ฉ๋ชจ๋ฆฌ ๊ฐ์ง ๋ฐ ๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํ์์ ๊ฐ์ ์์ ์ ์ฌ์ฉ๋ฉ๋๋ค.) ์ค์ ๋ก ์ถ๋ ฅ์ ๋๋ฒ๊น ํ๋ ๋์ ์ถ์ ํ๋ค ๋งจ ๋๋ถํฐ ์ฝ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์๋์ ์ฑ๋ฆฐ์ง๊ฐ ์์ต๋๋ค. ์ฐ๋ค, ์ค๋ฅ ๋ฉ์์ง๊ฐ ํ์๋ฉ๋๋ค. ์๋ฅผ ๋ณด๋ฉด ์ฒซ ๋ฒ์งธ ์๋ชป๋ ์์คํ ํธ์ถ์ธ ํธ์ถ์ด ๋ณด์ ๋๋ค. ์ด๊ธฐ, ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. ์๋ ธ์ํธ ("ํ์ผ ๋๋ ๋๋ ํฐ๋ฆฌ๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค.") ์ด๋ ค๊ณ ํ๋ ์ค /etc/foo/config.json. ์ฌ๊ธฐ์ ๊ตฌ์ฑ ํ์ผ์ด ์์ด์ผ ํฉ๋๋ค.
์ด๊ฒ์ ๋จ์ง ์์ผ ๋ฟ์ด์ง๋ง ์ ๊ฐ ์ฌ์ฉํ๋ ์๊ฐ์ 90%๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ์ถ์ ํ๋ค, ์ด๊ฒ๋ณด๋ค ๋ ์ด๋ ค์ด ์ผ์ ์์ต๋๋ค. ๋ค์์ ์์ ํ ๋จ๊ณ๋ณ ๋๋ฒ๊น ๊ฐ์ด๋์ ๋๋ค.
- ํ๋ก๊ทธ๋จ์ ์์คํ ์ค๋ฅ์ ๋ํ ๋ชจํธํ ๋ฉ์์ง ๋๋ฌธ์ ํ๋ฅผ ๋ ๋๋ค.
- ๋ค์์ผ๋ก ํ๋ก๊ทธ๋จ์ ๋ค์ ์์ํ์ธ์. ์ถ์ ํ๋ค
- ์ถ์ ๊ฒฐ๊ณผ์์ ์ค๋ฅ ๋ฉ์์ง ์ฐพ๊ธฐ
- ์ฒซ ๋ฒ์งธ ์คํจํ ์์คํ ํธ์ถ์ด ๋ฐ์ํ ๋๊น์ง ๋ ๋์ด ์ฌ๋ผ๊ฐ๋๋ค.
4๋จ๊ณ์ ์์คํ ํธ์ถ์ ํตํด ๋ฌด์์ด ์๋ชป๋์๋์ง ๋ฐํ์ง ๊ฐ๋ฅ์ฑ์ด ๋งค์ฐ ๋์ต๋๋ค.
ํ
๋ณด๋ค ๋ณต์กํ ๋๋ฒ๊น ์ ์๋ฅผ ๋ณด์ฌ์ฃผ๊ธฐ ์ ์ ํจ๊ณผ์ ์ธ ์ฌ์ฉ์ ์ํ ๋ช ๊ฐ์ง ์๋ น์ ๋ณด์ฌ ๋๋ฆฌ๊ฒ ์ต๋๋ค. ์ถ์ ํ๋ค:
๋จ์๋ ๋ค ์น๊ตฌ์ผ
๋ง์ *nix ์์คํ ์์ ์ปค๋์ ๋ํ ์ ์ฒด ์์คํ ํธ์ถ ๋ชฉ๋ก์ ๋ค์์ ์คํํ์ฌ ์ป์ ์ ์์ต๋๋ค. ๋จ์ ์์คํ ์ฝ. ๋ค์๊ณผ ๊ฐ์ ๋ด์ฉ์ด ํ์๋ฉ๋๋ค. brk(2)์ด๋ ๋ค์์ ์คํํ์ฌ ๋ ๋ง์ ์ ๋ณด๋ฅผ ์ป์ ์ ์์์ ์๋ฏธํฉ๋๋ค. ๋จ์ 2brk.
์์ ๊ฐํด: ๋จ์ 2 ํฌํฌ ์ ํ์ด์ง๋ฅผ ๋ณด์ฌ์ค๋๋ค ํฌํฌ() ะฒ GNU libc, ์ด๋ ๋ค์์ ํธ์ถํ์ฌ ๊ตฌํ๋๋ ๊ฒ์ผ๋ก ๋ํ๋ฌ์ต๋๋ค. clone (). ํธ์ถ ์๋ฏธ๋ก ํฌํฌ ๋ค์์ ์ฌ์ฉํ์ฌ ํ๋ก๊ทธ๋จ์ ์์ฑํ๋ฉด ๋์ผํ๊ฒ ์ ์ง๋ฉ๋๋ค. ํฌํฌ(), ์ถ์ ์ ์คํํฉ๋๋ค. ์ ํ๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค. ํฌํฌ, ๊ทธ ๋์ ์ clone (). ์ด๋ฌํ ๊ฐํด๋ ์์ค์ ์ถ๋ ฅ์ ๋น๊ตํ๊ธฐ ์์ํ๋ ๊ฒฝ์ฐ์๋ง ํผ๋์ ์ค๋๋ค. ์ถ์ ํ๋ค.
-o๋ฅผ ์ฌ์ฉํ์ฌ ์ถ๋ ฅ์ ํ์ผ์ ์ ์ฅํฉ๋๋ค.
์ถ์ ํ๋ค ๊ด๋ฒ์ํ ์ถ๋ ฅ์ ์์ฑํ ์ ์์ผ๋ฏ๋ก ์ถ์ ๊ฒฐ๊ณผ๋ฅผ ๋ณ๋์ ํ์ผ์ ์ ์ฅํ๋ ๊ฒ์ด ์ ์ฉํ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค(์์ ์ ์ฐธ์กฐ). ์ด๋ ๋ํ ํ๋ก๊ทธ๋จ ์ถ๋ ฅ๊ณผ ์ถ๋ ฅ์ ํผ๋์ ๋ฐฉ์งํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. ์ถ์ ํ๋ค ์ฝ์์์.
๋ ๋ง์ ์ธ์ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ ค๋ฉด -s๋ฅผ ์ฌ์ฉํ์ธ์.
์์ ์์ ์ถ์ ์๋ ์ค๋ฅ ๋ฉ์์ง์ ํ๋ฐ๋ถ๊ฐ ํ์๋์ง ์์ ๊ฒ์ ์ ์ ์์ต๋๋ค. ์๋ํ๋ฉด ์ถ์ ํ๋ค ๊ธฐ๋ณธ๊ฐ์ ๋ฌธ์์ด ์ธ์์ ์ฒ์ 32๋ฐ์ดํธ๋ง ํ์ํฉ๋๋ค. ๋ ๋ณด๊ณ ์ถ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ถ๊ฐํ์ธ์. -s 128 ์ ํ์ ์ถ์ ํ๋ค.
-y๋ฅผ ์ฌ์ฉํ๋ฉด ํ์ผ, ์์ผ ๋ฑ์ ๋ ์ฝ๊ฒ ์ถ์ ํ ์ ์์ต๋๋ค.
"All is file"์ *nix ์์คํ ์ด ํ์ผ, ๋คํธ์ํฌ ๋๋ ํ๋ก์ธ์ค ๊ฐ ํ์ดํ์ ์ ์ฉ๋๋์ง ์ฌ๋ถ์ ๊ด๊ณ์์ด ํ์ผ ์ค๋ช ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ชจ๋ I/O๋ฅผ ์ํํ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ์ด๋ ํ๋ก๊ทธ๋๋ฐ์๋ ํธ๋ฆฌํ์ง๋ง ์ผ๋ฐ์ ์ธ ๋ด์ฉ์ ๋ณด๋ฉด ์ค์ ๋ก ๋ฌด์จ ์ผ์ด ์ผ์ด๋๊ณ ์๋์ง ์ถ์ ํ๊ธฐ๊ฐ ์ด๋ ต์ต๋๋ค. ์ฝ๊ธฐ ะธ ์ฐ๋ค ์์คํ ํธ์ถ ์ถ์ ๊ฒฐ๊ณผ์์.
์ฐ์ฐ์๋ฅผ ์ถ๊ฐํ์ฌ y, ๋น์ ์ ๊ฐ์ ๋ก ์ถ์ ํ๋ค ์ถ๋ ฅ์ ๊ฐ ํ์ผ ์ค๋ช ์์ ๊ทธ๊ฒ์ด ๊ฐ๋ฆฌํค๋ ๋ด์ฉ์ ๊ธฐ๋กํด ์ฃผ์์ ๋ต๋๋ค.
-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
์์์ด, ๊ทธ ๋ง์ ๋ธ๋ก ํน์ ํ์ผ์ ์์ฑํ๋ ค๊ณ ํ์ง๋ง ์๋ํ์ง ์์๊ณ ๊ทธ ์ด์ ๋ฅผ ์ธ์ ํ์ง ์์์ต๋๋ค. ๋ฐ๊ฒฌ ์ถ์ ํ๋ค:
# 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์ด ๋ฌด์์ ๋ํ๋ด๋์ง ์ด๋ป๊ฒ ์ ์ ์๋์? ์ด ํน๋ณํ ๊ฒฝ์ฐ์๋ ๋ค์์ ์คํํ ์ ์์ต๋๋ค. ์ถ์ ํ๋ค ั ์์ y (์ ์ฐธ์กฐ) ์๋์ผ๋ก ์๋ ค ์ฃผ์ง๋ง ์ด์ ๊ฐ์ ๋ด์ฉ์ ํ์ ํ๋ ค๋ฉด ์ถ์ ๊ฒฐ๊ณผ๋ฅผ ์ฝ๊ณ ๊ตฌ๋ฌธ ๋ถ์ํ๋ ๋ฐฉ๋ฒ์ ์๋ ๊ฒ์ด ์ ์ฉํฉ๋๋ค.
ํ์ผ ์ค๋ช ์์ ์์ค๋ ๋ง์ ์์คํ ํธ์ถ ์ค ํ๋์ผ ์ ์์ต๋๋ค(๋ชจ๋ ์ค๋ช ์์ ์ฉ๋์ ๋ฐ๋ผ ๋ค๋ฆ - ์ฝ์, ๋คํธ์ํฌ ์์ผ, ํ์ผ ์์ฒด ๋๋ ๊ธฐํ). ๊ทธ๋ฌ๋ ๊ทธ๋ด ์๋ ์์ผ๋ฏ๋ก ์ฐ๋ฆฌ๋ ๋ค์์ ์ฐพ์ต๋๋ค. 3์ ๋ฐํํ์ฌ ํธ์ถํฉ๋๋ค(์ฆ, ์ถ์ ๊ฒฐ๊ณผ์์ "= 3"์ ์ฐพ์ต๋๋ค). ์ด ๊ฒฐ๊ณผ์๋ 2๊ฐ์ง๊ฐ ์์ต๋๋ค. ์ด๊ธฐ ๋งจ ๊ผญ๋๊ธฐ์ ๊ทธ๋ฆฌ๊ณ ์์ผ ์ค๊ฐ์. ์ด๊ธฐ ํ์ผ์ ์ด์ง๋ง ๊ฐ๊น์ด(3)์ ๋ค์ ๋ซํ๋ ๊ฒ์ ๋ณด์ฌ์ค๋๋ค. (Rake: ํ์ผ ์ค๋ช ์๋ฅผ ์ด๊ณ ๋ซ์ ๋ ์ฌ์ฌ์ฉํ ์ ์์ต๋๋ค.) ๋ถ๋ฅด๋ค ์์ผ() ์ ๋ง์ง๋ง์ด๋๊น ์ ๋นํด ์ฝ๋ค(), bcrontab์ ์์ผ์ ํตํด ๋ฌด์ธ๊ฐ์ ์๋ํ๋ ๊ฒ์ผ๋ก ๋ํ๋ฌ์ต๋๋ค. ๋ค์ ์ค์ ํ์ผ ์ค๋ช ์๊ฐ ๋ค์๊ณผ ์ฐ๊ด๋์ด ์์์ ๋ณด์ฌ์ค๋๋ค. ์ ๋์ค ๋๋ฉ์ธ ์์ผ ๋์ค์ /var/run/bcron-์คํ.
๋ฐ๋ผ์ ์ฐ๋ฆฌ๋ ๋ค์๊ณผ ๊ด๋ จ๋ ํ๋ก์ธ์ค๋ฅผ ์ฐพ์์ผ ํฉ๋๋ค. ์ ๋์ค ์์ผ ๋ฐ๋ํธ์. ์ด ๋ชฉ์ ์ ์ํ ๋ช ๊ฐ์ง ์ ์ฉํ ๋ฐฉ๋ฒ์ด ์์ผ๋ฉฐ ๋ ๋ค ์๋ฒ ๋ฐฐํฌ ๋๋ฒ๊น ์ ์ ์ฉํฉ๋๋ค. ์ฒซ ๋ฒ์งธ๋ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค. 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))
์ด๋ ์ฒญ์ทจ์๊ฐ ๋ช ๋ น์์ ๋ํ๋ ๋๋ค. inix์๋ฒ, ํ๋ก์ธ์ค ID 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/์ถ์ -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 ๋ฑ) ์ด ํ๋ก์ธ์ค๋ ์ง์ํ ์ ์๋ฏ์ด ์ค์ ์์ ์ ์ํํ๋ ํ์ ํ๋ก์ธ์ค๋ฅผ ์์ฑํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ๋ ์ ํ์ ์ ๋ฐ๋ผ์ก์์ผ ํ๋ค๋ฉด ํตํ์ ์ถ๊ฐํ์ธ์ ์ถ์ -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/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์ผ๋ก ์คํ๋์ง๋ง ๋ฃจํธ๋ง ๋๋ ํ ๋ฆฌ์ ์ธ ์ ์๋ ๊ถํ์ด ์์ต๋๋ค. /var/spool/cron/tmp/. ๊ฐ๋จํ ๋ช ๋ น chown cron /var/spool/cron/tmp/ ํ ๊ฒ ๋ธ๋ก ์ฌ๋ฐ๋ฅด๊ฒ ์๋ํ์ญ์์ค. (๋ง์ฝ ๊ทธ๊ฒ์ด ๋ฌธ์ ๊ฐ ์๋์๋ค๋ฉด ๋ค์์ผ๋ก ์์ฌ๋๋ ๊ฒ์ SELinux ๋๋ AppArmor์ ๊ฐ์ ์ปค๋ ๋ณด์ ๋ชจ๋์ด๋ฏ๋ก ๋ค์์ผ๋ก ์ปค๋ ๋ฉ์์ง ๋ก๊ทธ๋ฅผ ํ์ธํ๊ฒ ์ต๋๋ค. dmesg์.)
์ ์ฒด๋ก
์์คํ ํธ์ถ ์ถ์ ์ ์ด๋ณด์์๊ฒ ๋ถ๋ด์ค๋ฌ์ธ ์ ์์ง๋ง ์ด๊ฒ์ด ์ผ๋ฐ์ ์ธ ๋ฐฐํฌ ๋ฌธ์ ์ ์ฒด๋ฅผ ๋๋ฒ๊ทธํ๋ ๋น ๋ฅธ ๋ฐฉ๋ฒ์ด๋ผ๋ ์ ์ ๋ณด์ฌ์ฃผ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ๋ค์ค ํ๋ก์ธ์ค๋ฅผ ๋๋ฒ๊น ํ๋ ค๊ณ ํ๋ค๊ณ ์์ํด ๋ณด์ธ์. ๋ธ๋ก ๋จ๊ณ๋ณ ๋๋ฒ๊ฑฐ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์ผ๋ จ์ ์์คํ ํธ์ถ์ ๋ฐ๋ผ ์ญ๋ฐฉํฅ์ผ๋ก ์ถ์ ๊ฒฐ๊ณผ๋ฅผ ๊ตฌ๋ฌธ ๋ถ์ํ๋ ค๋ฉด ๊ธฐ์ ์ด ํ์ํ์ง๋ง ์์ ๋งํ๋ฏ์ด ๊ฑฐ์ ํญ์ ๋ค์์ ์ฌ์ฉํฉ๋๋ค. ์ถ์ ํ๋ค, ์ถ์ ๊ฒฐ๊ณผ๋ฅผ ์ป๊ณ ๋๋ถํฐ ์ค๋ฅ๋ฅผ ์ฐพ์ต๋๋ค. ๊ทธ๋๋, ์ถ์ ํ๋ค ๋๋ฒ๊น ์ ๋ง์ ์๊ฐ์ ์ ์ฝํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. ๋๋ ๊ทธ๊ฒ์ด ๋น์ ์๊ฒ๋ ์ ์ฉํ ๊ฒ์ด๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
์ถ์ฒ : habr.com