mysql -e "select sleep(30)"
とかやっておいてMySQL側はどういう処理をしているのかをstraceで見てみるメモ
poll([{fd=41, events=POLLIN|POLLPRI}], 1, 0) = 1 ([{fd=41, revents=POLLIN}]) ioctl(41, FIONREAD, [0]) = 0 futex(0x1d8ff10, FUTEX_WAKE_PRIVATE, 1) = 0 gettimeofday({tv_sec=1671460663, tv_usec=593861}, NULL) = 0 write(41, "\27\3\3\0R\f\264\237\301\202\6\271\4\2T\253\260\316(\231\33e\244\216zr\351\216\334\"\224\332"..., 87) = 87 clock_gettime(CLOCK_REALTIME, {tv_sec=1671460663, tv_nsec=594239259}) = 0 gettimeofday({tv_sec=1671460663, tv_usec=594273}, NULL) = 0 gettimeofday({tv_sec=1671460663, tv_usec=594321}, NULL) = 0 read(41, "", 5) = 0 gettimeofday({tv_sec=1671460663, tv_usec=594450}, NULL) = 0 gettimeofday({tv_sec=1671460663, tv_usec=594474}, NULL) = 0 write(2, "2022-12-19T14:37:43.594474Z 48 ["..., 157) = 157 shutdown(41, SHUT_RDWR) = -1 ENOTCONN (Transport endpoint is not connected) close(41) = 0 futex(0x1db4474, FUTEX_WAIT_PRIVATE, 95, NULL^Cstrace: Process 529 detached <detached ...>
sleepなのでpoll(2)で待ち続けている。ここでmysqlのクライアント側をkill -9
とかしてみるとOSによってMySQLへFINが飛ばされる。poll(2)はPOLLINのイベントで戻る。socketに対して何かをwriteしているがこれは何かわからなかった。その後はread(2)を実行して0(EOF)が変えるのでログにクライアントが消失したことを書く。その後はshutdown(2)してclose(2)している。