今日覚えて帰ること
strace
システムコールとシグナルを追跡するのに使用するコマンド。
straceコマンドの引数に、普段利用しているコマンドとその引数を入れて実行すればいい。
Syscall Activity Strace
Use strace to investigate some common commands
Use
strace
to see which syscalls the following commands perform:
kill -9 1234
kill -15 1234
uname
nc -l -p 8080
今回はstraceを使って普段使っているコマンドがどんなことをしているのかを確認してみよう!の回です。
そもそもstraceコマンドについてよくわからないので調査します。
strace を使用して、コマンドが実行したシステムコールを追跡する – Red Hat Customer Portal
strace
コマンドは、システムコールとシグナルを追跡するのに使用します
というわけで、straceはLinuxやUnix系のシステムで使用されるツールで、プロセスが実行しているシステムコール(system calls)と、それに対応するシグナルを追跡・記録するために使用されます。
システムコールは、プログラムがカーネルと対話するためのインターフェースであり、straceはそれらを監視することで、プログラムがどのように動作しているか、特にカーネルとのやり取りに焦点を当てて把握することができます。
straceは”system trace”の略称です。
それでは早速見ていきましょう。
使いかたは簡単で、straceコマンドの引数にチェックしたいコマンドを入れて実行するだけでOKです。
controlplane $ strace kill -9 1234
execve("/usr/bin/kill", ["kill", "-9", "1234"], 0x7ffd702891d0 /* 16 vars */) = 0
brk(NULL) = 0x564647661000
arch_prctl(0x3001 /* ARCH_??? */, 0x7ffc09124d70) = -1 EINVAL (Invalid argument)
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=65112, ...}) = 0
mmap(NULL, 65112, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f354582f000
close(3) = 0
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libprocps.so.8", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0 K\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0644, st_size=80072, ...}) = 0
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f354582d000
mmap(NULL, 159768, PROT_READ, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f3545805000
mmap(0x7f3545809000, 40960, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x4000) = 0x7f3545809000
mmap(0x7f3545813000, 16384, PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0xe000) = 0x7f3545813000
mmap(0x7f3545817000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x11000) = 0x7f3545817000
mmap(0x7f354581a000, 73752, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f354581a000
close(3) = 0
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\300A\2\0\0\0\0\0"..., 832) = 832
pread64(3, "\6\0\0\0\4\0\0\0@\0\0\0\0\0\0\0@\0\0\0\0\0\0\0@\0\0\0\0\0\0\0"..., 784, 64) = 784
pread64(3, "\4\0\0\0\20\0\0\0\5\0\0\0GNU\0\2\0\0\300\4\0\0\0\3\0\0\0\0\0\0\0", 32, 848) = 32
pread64(3, "\4\0\0\0\24\0\0\0\3\0\0\0GNU\0\7\2C\n\357_\243\335\2449\206V>\237\374\304"..., 68, 880) = 68
fstat(3, {st_mode=S_IFREG|0755, st_size=2029592, ...}) = 0
pread64(3, "\6\0\0\0\4\0\0\0@\0\0\0\0\0\0\0@\0\0\0\0\0\0\0@\0\0\0\0\0\0\0"..., 784, 64) = 784
pread64(3, "\4\0\0\0\20\0\0\0\5\0\0\0GNU\0\2\0\0\300\4\0\0\0\3\0\0\0\0\0\0\0", 32, 848) = 32
pread64(3, "\4\0\0\0\24\0\0\0\3\0\0\0GNU\0\7\2C\n\357_\243\335\2449\206V>\237\374\304"..., 68, 880) = 68
mmap(NULL, 2037344, PROT_READ, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f3545613000
mmap(0x7f3545635000, 1540096, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x22000) = 0x7f3545635000
mmap(0x7f35457ad000, 319488, PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x19a000) = 0x7f35457ad000
mmap(0x7f35457fb000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1e7000) = 0x7f35457fb000
mmap(0x7f3545801000, 13920, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f3545801000
close(3) = 0
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libsystemd.so.0", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\300\33\1\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0644, st_size=709496, ...}) = 0
mmap(NULL, 713968, PROT_READ, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f3545564000
mmap(0x7f3545574000, 479232, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x10000) = 0x7f3545574000
mmap(0x7f35455e9000, 151552, PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x85000) = 0x7f35455e9000
mmap(0x7f354560e000, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0xa9000) = 0x7f354560e000
mmap(0x7f3545612000, 1264, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f3545612000
close(3) = 0
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libdl.so.2", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0 \22\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0644, st_size=18848, ...}) = 0
mmap(NULL, 20752, PROT_READ, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f354555e000
mmap(0x7f354555f000, 8192, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1000) = 0x7f354555f000
mmap(0x7f3545561000, 4096, PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x3000) = 0x7f3545561000
mmap(0x7f3545562000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x3000) = 0x7f3545562000
close(3) = 0
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/librt.so.1", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0 '\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0644, st_size=35960, ...}) = 0
mmap(NULL, 39904, PROT_READ, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f3545554000
mmap(0x7f3545556000, 16384, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x2000) = 0x7f3545556000
mmap(0x7f354555a000, 8192, PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x6000) = 0x7f354555a000
mmap(0x7f354555c000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x7000) = 0x7f354555c000
close(3) = 0
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/liblzma.so.5", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\3003\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0644, st_size=162264, ...}) = 0
mmap(NULL, 164104, PROT_READ, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f354552b000
mprotect(0x7f354552e000, 147456, PROT_NONE) = 0
mmap(0x7f354552e000, 98304, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x3000) = 0x7f354552e000
mmap(0x7f3545546000, 45056, PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1b000) = 0x7f3545546000
mmap(0x7f3545552000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x26000) = 0x7f3545552000
close(3) = 0
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/liblz4.so.1", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0 !\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0644, st_size=129248, ...}) = 0
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f3545529000
mmap(NULL, 131168, PROT_READ, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f3545508000
mmap(0x7f354550a000, 106496, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x2000) = 0x7f354550a000
mmap(0x7f3545524000, 12288, PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1c000) = 0x7f3545524000
mmap(0x7f3545527000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1e000) = 0x7f3545527000
close(3) = 0
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libgcrypt.so.20", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\200\305\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0644, st_size=1168056, ...}) = 0
mmap(NULL, 1171400, PROT_READ, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f35453ea000
mmap(0x7f35453f6000, 843776, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0xc000) = 0x7f35453f6000
mmap(0x7f35454c4000, 249856, PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0xda000) = 0x7f35454c4000
mmap(0x7f3545501000, 28672, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x116000) = 0x7f3545501000
close(3) = 0
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libpthread.so.0", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\220q\0\0\0\0\0\0"..., 832) = 832
pread64(3, "\4\0\0\0\24\0\0\0\3\0\0\0GNU\0\232e\273F\236E\241\306\373\317\372\345\270*/\327"..., 68, 824) = 68
fstat(3, {st_mode=S_IFREG|0755, st_size=157224, ...}) = 0
pread64(3, "\4\0\0\0\24\0\0\0\3\0\0\0GNU\0\232e\273F\236E\241\306\373\317\372\345\270*/\327"..., 68, 824) = 68
mmap(NULL, 140408, PROT_READ, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f35453c7000
mmap(0x7f35453cd000, 69632, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x6000) = 0x7f35453cd000
mmap(0x7f35453de000, 24576, PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x17000) = 0x7f35453de000
mmap(0x7f35453e4000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1c000) = 0x7f35453e4000
mmap(0x7f35453e6000, 13432, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f35453e6000
close(3) = 0
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libgpg-error.so.0", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0`L\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0644, st_size=137584, ...}) = 0
mmap(NULL, 139872, PROT_READ, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f35453a4000
mmap(0x7f35453a8000, 77824, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x4000) = 0x7f35453a8000
mmap(0x7f35453bb000, 40960, PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x17000) = 0x7f35453bb000
mmap(0x7f35453c5000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x20000) = 0x7f35453c5000
close(3) = 0
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f35453a2000
mmap(NULL, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f354539f000
arch_prctl(ARCH_SET_FS, 0x7f354539f7c0) = 0
mprotect(0x7f35457fb000, 16384, PROT_READ) = 0
mprotect(0x7f35453c5000, 4096, PROT_READ) = 0
mprotect(0x7f35453e4000, 4096, PROT_READ) = 0
mprotect(0x7f3545501000, 8192, PROT_READ) = 0
mprotect(0x7f3545527000, 4096, PROT_READ) = 0
mprotect(0x7f3545552000, 4096, PROT_READ) = 0
mprotect(0x7f354555c000, 4096, PROT_READ) = 0
mprotect(0x7f3545562000, 4096, PROT_READ) = 0
mprotect(0x7f354560e000, 12288, PROT_READ) = 0
mprotect(0x7f3545817000, 8192, PROT_READ) = 0
mprotect(0x5646475ae000, 4096, PROT_READ) = 0
mprotect(0x7f354586c000, 4096, PROT_READ) = 0
munmap(0x7f354582f000, 65112) = 0
set_tid_address(0x7f354539fa90) = 13123
set_robust_list(0x7f354539faa0, 24) = 0
rt_sigaction(SIGRTMIN, {sa_handler=0x7f35453cdbf0, sa_mask=[], sa_flags=SA_RESTORER|SA_SIGINFO, sa_restorer=0x7f35453db420}, NULL, 8) = 0
rt_sigaction(SIGRT_1, {sa_handler=0x7f35453cdc90, sa_mask=[], sa_flags=SA_RESTORER|SA_RESTART|SA_SIGINFO, sa_restorer=0x7f35453db420}, NULL, 8) = 0
rt_sigprocmask(SIG_UNBLOCK, [RTMIN RT_1], NULL, 8) = 0
prlimit64(0, RLIMIT_STACK, NULL, {rlim_cur=8192*1024, rlim_max=RLIM64_INFINITY}) = 0
brk(NULL) = 0x564647661000
brk(0x564647682000) = 0x564647682000
openat(AT_FDCWD, "/proc/self/auxv", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0400, st_size=0, ...}) = 0
read(3, "!\0\0\0\0\0\0\0\0\200\34\t\374\177\0\0\20\0\0\0\0\0\0\0\377\373\213\7\0\0\0\0"..., 1024) = 320
close(3) = 0
openat(AT_FDCWD, "/proc/sys/kernel/osrelease", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0444, st_size=0, ...}) = 0
read(3, "5.4.0-131-generic\n", 1024) = 18
close(3) = 0
openat(AT_FDCWD, "/sys/devices/system/cpu/online", O_RDONLY|O_CLOEXEC) = 3
read(3, "0\n", 8192) = 2
close(3) = 0
openat(AT_FDCWD, "/proc/self/auxv", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0400, st_size=0, ...}) = 0
read(3, "!\0\0\0\0\0\0\0\0\200\34\t\374\177\0\0\20\0\0\0\0\0\0\0\377\373\213\7\0\0\0\0"..., 1024) = 320
close(3) = 0
getpid() = 13123
kill(1234, SIGKILL) = -1 ESRCH (No such process)
write(2, "kill: ", 6kill: ) = 6
write(2, "(1234)", 6(1234)) = 6
write(2, ": No such process", 17: No such process) = 17
write(2, "\n", 1
) = 1
close(1) = 0
close(2) = 0
exit_group(1) = ?
+++ exited with 1 +++
controlplane $
kill -9 1234は、pid(プロセスID)が1234であるプロセスをSIGKILL(強制終了)するコマンドです。
-9でプロセスに送るシグナルを規定しています。
見てもさっぱりなので、ここを見ろよとkiller codaにおすすめされている箇所を見てみます。
controlplane $ strace kill -9 1234 2>&1 | grep 1234
execve("/usr/bin/kill", ["kill", "-9", "1234"], 0x7ffd64498700 /* 16 vars */) = 0
kill(1234, SIGKILL) = -1 ESRCH (No such process)
write(2, "(1234)", 6(1234)) = 6
controlplane $
SIGKILLしてるっぽいことはわかりますが、それ以上のことはちょっとよくわからないですね。
次も重要そうなところだけ見てみます。
controlplane $ strace kill -15 1234 2>&1 | grep 1234
execve("/usr/bin/kill", ["kill", "-15", "1234"], 0x7ffd4fe183a0 /* 16 vars */) = 0
kill(1234, SIGTERM) = -1 ESRCH (No such process)
write(2, "(1234)", 6(1234)) = 6
controlplane $
kill -15 1234は、pid(プロセスID)が1234であるプロセスをSIGTERM(通常終了)するコマンドです。
-15でプロセスに送るシグナルを規定しています。
SIGTERMしてるっぽいことはわかりますが、それ以上のことはちょっとよくわからないですね。
controlplane $ strace uname
execve("/usr/bin/uname", ["uname"], 0x7ffd4e329830 /* 16 vars */) = 0
brk(NULL) = 0x556c95fef000
arch_prctl(0x3001 /* ARCH_??? */, 0x7ffe4c9dda30) = -1 EINVAL (Invalid argument)
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=65112, ...}) = 0
mmap(NULL, 65112, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f83ba50f000
close(3) = 0
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\300A\2\0\0\0\0\0"..., 832) = 832
pread64(3, "\6\0\0\0\4\0\0\0@\0\0\0\0\0\0\0@\0\0\0\0\0\0\0@\0\0\0\0\0\0\0"..., 784, 64) = 784
pread64(3, "\4\0\0\0\20\0\0\0\5\0\0\0GNU\0\2\0\0\300\4\0\0\0\3\0\0\0\0\0\0\0", 32, 848) = 32
pread64(3, "\4\0\0\0\24\0\0\0\3\0\0\0GNU\0\7\2C\n\357_\243\335\2449\206V>\237\374\304"..., 68, 880) = 68
fstat(3, {st_mode=S_IFREG|0755, st_size=2029592, ...}) = 0
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f83ba50d000
pread64(3, "\6\0\0\0\4\0\0\0@\0\0\0\0\0\0\0@\0\0\0\0\0\0\0@\0\0\0\0\0\0\0"..., 784, 64) = 784
pread64(3, "\4\0\0\0\20\0\0\0\5\0\0\0GNU\0\2\0\0\300\4\0\0\0\3\0\0\0\0\0\0\0", 32, 848) = 32
pread64(3, "\4\0\0\0\24\0\0\0\3\0\0\0GNU\0\7\2C\n\357_\243\335\2449\206V>\237\374\304"..., 68, 880) = 68
mmap(NULL, 2037344, PROT_READ, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f83ba31b000
mmap(0x7f83ba33d000, 1540096, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x22000) = 0x7f83ba33d000
mmap(0x7f83ba4b5000, 319488, PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x19a000) = 0x7f83ba4b5000
mmap(0x7f83ba503000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1e7000) = 0x7f83ba503000
mmap(0x7f83ba509000, 13920, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f83ba509000
close(3) = 0
arch_prctl(ARCH_SET_FS, 0x7f83ba50e580) = 0
mprotect(0x7f83ba503000, 16384, PROT_READ) = 0
mprotect(0x556c94352000, 4096, PROT_READ) = 0
mprotect(0x7f83ba54c000, 4096, PROT_READ) = 0
munmap(0x7f83ba50f000, 65112) = 0
brk(NULL) = 0x556c95fef000
brk(0x556c96010000) = 0x556c96010000
uname({sysname="Linux", nodename="controlplane", ...}) = 0
fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(0x88, 0), ...}) = 0
write(1, "Linux\n", 6Linux
) = 6
close(1) = 0
close(2) = 0
exit_group(0) = ?
+++ exited with 0 +++
controlplane $
uname コマンドは、システム情報を表示するためのコマンドです。
LinuxやUnix系のオペレーティングシステムで使用され、カーネルの名前やバージョン、ホスト名、ハードウェアアーキテクチャなどの情報を取得することができます。
unameのuはunixからきているらしいです。
これに関してはもう全くわかりません。
controlplane $ strace nc -l -p 8080 2>&1 | grep 8080
execve("/usr/bin/nc", ["nc", "-l", "-p", "8080"], 0x7ffdb58422c8 /* 16 vars */) = 0
bind(3, {sa_family=AF_INET, sin_port=htons(8080), sin_addr=inet_addr("0.0.0.0")}, 16) = 0
nc -l -p 8080 はNetcat(nc)コマンドを使用して、ポート8080で接続待ち(リッスン)をするためのコマンドです。
ncはネットワーク接続を操作するための非常に柔軟なツールで、ポートを開いて接続を受け入れたり、クライアントとして接続を確立したりすることができます。
-l がリッスンモードで、nsコマンドにより立ち上がったプロセスが、指定したポートで待ち受けるサーバーとして動くことを意味しています。
-p 8080で、待ち受けるポートの番号を指定しています。
ただ、結局これもstraceで確認したところで何をしているのかはよくわかりません。
Use strace to investigate Apiserver process
Use
strace
to see what kind of syscalls thekube-apiserver
process performs.
straceを使ってkube-apiserverプロセスがどんなシステムコールをしているのか見ていきます。
まずはkube-apiserverに割り当てられているpidを確認します。
controlplane $ ps aux | grep kube-apiserver
root 2700 3.4 11.7 1540796 238272 ? Ssl 15:09 1:21 kube-apiserver --advertise-address=172.30.1.2 --allow-privileged=true --authorization-mode=Node,RBAC --client-ca-file=/etc/kubernetes/pki/ca.crt --enable-admission-plugins=NodeRestriction --enable-bootstrap-token-auth=true --etcd-cafile=/etc/kubernetes/pki/etcd/ca.crt --etcd-certfile=/etc/kubernetes/pki/apiserver-etcd-client.crt --etcd-keyfile=/etc/kubernetes/pki/apiserver-etcd-client.key --etcd-servers=https://127.0.0.1:2379 --kubelet-client-certificate=/etc/kubernetes/pki/apiserver-kubelet-client.crt --kubelet-client-key=/etc/kubernetes/pki/apiserver-kubelet-client.key --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname --proxy-client-cert-file=/etc/kubernetes/pki/front-proxy-client.crt --proxy-client-key-file=/etc/kubernetes/pki/front-proxy-client.key --requestheader-allowed-names=front-proxy-client --requestheader-client-ca-file=/etc/kubernetes/pki/front-proxy-ca.crt --requestheader-extra-headers-prefix=X-Remote-Extra- --requestheader-group-headers=X-Remote-Group --requestheader-username-headers=X-Remote-User --secure-port=6443 --service-account-issuer=https://kubernetes.default.svc.cluster.local --service-account-key-file=/etc/kubernetes/pki/sa.pub --service-account-signing-key-file=/etc/kubernetes/pki/sa.key --service-cluster-ip-range=10.96.0.0/12 --tls-cert-file=/etc/kubernetes/pki/apiserver.crt --tls-private-key-file=/etc/kubernetes/pki/apiserver.key
root 23875 0.0 0.0 3436 656 pts/0 S+ 15:48 0:00 grep --color=auto kube-apiserver
今回は2700でした。
strace -p 2700 -f # use your PID
-f はフォーク(fork)やスレッド(clone)で生成した子プロセスを含めて、全体を監視するためのオプションです。
このまま打ち込むとすごい量の出力が吐き出されるので出てくる内容を絞ります。
controlplane $ strace -p 2700 -f -cw
strace: Process 2700 attached with 7 threads
-c はプロセスが実行するシステムコールの統計情報を収集します。
-w はシステムコールの実行にかかった時間(ウォールクロックタイム)を記録します。
出力結果「Process 2700 attached with 7 threads」からは
Process 2700 attachedでプロセスID 2700のプロセスにstraceが正常にアタッチされ、システムコールの監視が開始されたことが分かります。
7 threadsでプロセスID 2700のプロセスが現在7つのスレッドで動作していることを示しています。