目录
报错信息
公司得开发对生产环境都有普通用户 www 得权限,采用堡垒机登录到生产环境得机器。
默认 supervisor 使用 root 用户启动,开发没有权限直接修改配置和操作 supervisor 管理得进程,所以 supervisor 都采用 www 用户启动就解决问题了。
但是今天操作生产环境得时候,报得错误令人懵逼,SRE 同学折腾了好久,配置来配置去,搞不明白为啥 www 就是启动不了 supervisor !
报错信息是这样得:
[www@**************** ~]$ supervisord -c /etc/supervisord.confError: Cannot open an HTTP server: socket.error reported errno.EACCES (13)For help, use /usr/bin/supervisord -h
翻遍谷歌、百度,找到得资料,没有一个真得能解决了问题,焦头烂额。
突然想起 strace 这个命令,于是乎,我改成这样子执行:
[www@**************** ~]$ strace supervisord -c /etc/supervisord.conf
奇迹发生了!
read(6, " S(1 N(3 R' R R24 (1 "..., 4096) = 1381read(6, "", 4096) = 0close(6) = 0close(5) = 0close(4) = 0getpid() = 3656unlink("/var/run/supervisor/supervisor.sock.3656") = -1 ENOENT (No such file or directory)socket(AF_UNIX, SOCK_STREAM, 0) = 4bind(4, {sa_family=AF_UNIX, sun_path="/var/run/supervisor/supervisor.sock.3656"}, 42) = -1 EACCES (Permission denied)unlink("/var/run/supervisor/supervisor.sock.3656") = -1 ENOENT (No such file or directory)write(2, "Error: Cannot open an HTTP serve"..., 75Error: Cannot open an HTTP server: socket.error reported errno.EACCES (13)) = 75write(2, "For help, use /usr/bin/superviso"..., 38For help, use /usr/bin/supervisord -h) = 38close(4) = 0rt_sigaction(SIGINT, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7fa06ce997e0}, {sa_handler=0x7fa06d1b0750, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7fa06ce997e0}, 8) = 0close(3) = 0close(11) = 0exit_group(2) = ?+++ exited with 2 +++
原来是没有权限,把 sock 文件挪到 www 用户下,问题解决。
关于 strace 命令
如果你得服务器还没安装 strace,可以用下面命令安装:
# Ubuntu / Debiansudo apt install strace# CentOSyum install -y strace
如果一个进程已经在运行,可以通过 PID 跟踪程序得系统调用,使用 CTRL + C 中止跟踪:
[root@**************** ~]# strace -p 16701strace: Process 16701 attachedrestart_syscall(<... resuming interrupted read ...>) = 0sendto(8, "*2rn$4rnLLENrn$52rnhorizon:comma"..., 73, MSG_DONTWAIT, NULL, 0) = 73poll([{fd=8, events=POLLIN|POLLERR|POLLHUP}], 1, 60000) = 1 ([{fd=8, revents=POLLIN}])recvfrom(8, ":0rn", 8192, MSG_DONTWAIT, NULL, NULL) = 4sendto(9, "*2rn$4rnLLENrn$14rnqueues:defaul"..., 35, MSG_DONTWAIT, NULL, 0) = 35poll([{fd=9, events=POLLIN|POLLERR|POLLHUP}], 1, 60000) = 1 ([{fd=9, revents=POLLIN}])recvfrom(9, ":0rn", 8192, MSG_DONTWAIT, NULL, NULL) = 4sendto(8, "*3rn$4rnHGETrn$21rnhorizon:queue"..., 55, MSG_DONTWAIT, NULL, 0) = 55poll([{fd=8, events=POLLIN|POLLERR|POLLHUP}], 1, 60000) = 1 ([{fd=8, revents=POLLIN}])recvfrom(8, "$18rn1.6690604487864007rn", 8192, MSG_DONTWAIT, NULL, NULL) = 25wait4(16711, 0x7ffeaafa566c, WNOHANG|WSTOPPED, NULL) = 0select(15, [12 14], [], [], {tv_sec=0, tv_usec=0}) = 0 (Timeout)wait4(16712, 0x7ffeaafa566c, WNOHANG|WSTOPPED, NULL) = 0select(17, [13 16], [], [], {tv_sec=0, tv_usec=0}) = 0 (Timeout)wait4(16713, 0x7ffeaafa566c, WNOHANG|WSTOPPED, NULL) = 0select(19, [15 18], [], [], {tv_sec=0, tv_usec=0}) = 0 (Timeout)sendto(8, "*14rn$5rnHMSETrn$54rnhorizon:sup"..., 500, MSG_DONTWAIT, NULL, 0) = 500sendto(8, "*4rn$4rnZADDrn$19rnhorizon:super"..., 99, MSG_DONTWAIT, NULL, 0) = 99sendto(8, "*3rn$6rnEXPIRErn$54rnhorizon:sup"..., 85, MSG_DONTWAIT, NULL, 0) = 85poll([{fd=8, events=POLLIN|POLLERR|POLLHUP}], 1, 60000) = 1 ([{fd=8, revents=POLLIN}])recvfrom(8, "+OKrn:0rn:1rn", 8192, MSG_DONTWAIT, NULL, NULL) = 13sendto(8, "*3rn$5rnSETNXrn$29rnhorizon:moni"..., 58, MSG_DONTWAIT, NULL, 0) = 58poll([{fd=8, events=POLLIN|POLLERR|POLLHUP}], 1, 60000) = 1 ([{fd=8, revents=POLLIN}])recvfrom(8, ":0rn", 8192, MSG_DONTWAIT, NULL, NULL) = 4rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0rt_sigaction(SIGCHLD, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0nanosleep({tv_sec=1, tv_nsec=0}, 0x7ffeaafa54a0) = 0sendto(8, "*2rn$4rnLLENrn$52rnhorizon:comma"..., 73, MSG_DONTWAIT, NULL, 0) = 73poll([{fd=8, events=POLLIN|POLLERR|POLLHUP}], 1, 60000) = 1 ([{fd=8, revents=POLLIN}])recvfrom(8, ":0rn", 8192, MSG_DONTWAIT, NULL, NULL) = 4wait4(16711, 0x7ffeaafa566c, WNOHANG|WSTOPPED, NULL) = 0select(15, [12 14], [], [], {tv_sec=0, tv_usec=0}) = 0 (Timeout)wait4(16712, 0x7ffeaafa566c, WNOHANG|WSTOPPED, NULL) = 0select(17, [13 16], [], [], {tv_sec=0, tv_usec=0}) = 0 (Timeout)wait4(16713, 0x7ffeaafa566c, WNOHANG|WSTOPPED, NULL) = 0select(19, [15 18], [], [], {tv_sec=0, tv_usec=0}) = 0 (Timeout)sendto(8, "*14rn$5rnHMSETrn$54rnhorizon:sup"..., 500, MSG_DONTWAIT, NULL, 0) = 500sendto(8, "*4rn$4rnZADDrn$19rnhorizon:super"..., 99, MSG_DONTWAIT, NULL, 0) = 99sendto(8, "*3rn$6rnEXPIRErn$54rnhorizon:sup"..., 85, MSG_DONTWAIT, NULL, 0) = 85poll([{fd=8, events=POLLIN|POLLERR|POLLHUP}], 1, 60000) = 1 ([{fd=8, revents=POLLIN}])recvfrom(8, "+OKrn:0rn:1rn", 8192, MSG_DONTWAIT, NULL, NULL) = 13sendto(8, "*3rn$5rnSETNXrn$29rnhorizon:moni"..., 58, MSG_DONTWAIT, NULL, 0) = 58poll([{fd=8, events=POLLIN|POLLERR|POLLHUP}], 1, 60000) = 1 ([{fd=8, revents=POLLIN}])recvfrom(8, ":0rn", 8192, MSG_DONTWAIT, NULL, NULL) = 4rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0rt_sigaction(SIGCHLD, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0nanosleep({tv_sec=1, tv_nsec=0}, ^Cstrace: Process 16701 detached <detached ...>
使用 -c 参数,可以得到各个系统调用得耗时、调用次数、错误数:
[root@**************** ~]# strace -p 16701 -cstrace: Process 16701 attached^Cstrace: Process 16701 detached% time seconds usecs/call calls errors syscall------ ----------- ----------- --------- --------- ---------------- 54.00 0.000216 5 39 sendto 11.25 0.000045 1 25 recvfrom 9.25 0.000037 1 25 poll 8.25 0.000033 5 6 nanosleep 6.50 0.000026 1 21 select 5.75 0.000023 1 21 wait4 3.50 0.000014 1 14 rt_sigprocmask 1.50 0.000006 0 7 rt_sigaction 0.00 0.000000 0 1 restart_syscall------ ----------- ----------- --------- --------- ----------------100.00 0.000400 159 total
使用 -tt 参数,显示时间戳(微妙),-T 参数显示系统调用得耗时,合起来用效果是这样得:
[root@**************** ~]# strace -p 16701 -tt -Tstrace: Process 16701 attached23:05:15.019519 restart_syscall(<... resuming interrupted read ...>) = 0 <0.915045>23:05:15.934770 sendto(8, "*2rn$4rnLLENrn$52rnhorizon:comma"..., 73, MSG_DONTWAIT, NULL, 0) = 73 <0.000080>23:05:15.934975 poll([{fd=8, events=POLLIN|POLLERR|POLLHUP}], 1, 60000) = 1 ([{fd=8, revents=POLLIN}]) <0.000022>23:05:15.935065 recvfrom(8, ":0rn", 8192, MSG_DONTWAIT, NULL, NULL) = 4 <0.000022>23:05:15.935215 wait4(16711, 0x7ffeaafa566c, WNOHANG|WSTOPPED, NULL) = 0 <0.000023>23:05:15.935301 select(15, [12 14], [], [], {tv_sec=0, tv_usec=0}) = 0 (Timeout) <0.000026>23:05:15.935390 wait4(16712, 0x7ffeaafa566c, WNOHANG|WSTOPPED, NULL) = 0 <0.000018>23:05:15.935446 select(17, [13 16], [], [], {tv_sec=0, tv_usec=0}) = 0 (Timeout) <0.000018>23:05:15.935503 wait4(16713, 0x7ffeaafa566c, WNOHANG|WSTOPPED, NULL) = 0 <0.000023>23:05:15.935574 select(19, [15 18], [], [], {tv_sec=0, tv_usec=0}) = 0 (Timeout) <0.000023>23:05:15.935731 sendto(8, "*14rn$5rnHMSETrn$54rnhorizon:sup"..., 500, MSG_DONTWAIT, NULL, 0) = 500 <0.000059>23:05:15.935848 sendto(8, "*4rn$4rnZADDrn$19rnhorizon:super"..., 99, MSG_DONTWAIT, NULL, 0) = 99 <0.000046>23:05:15.935937 sendto(8, "*3rn$6rnEXPIRErn$54rnhorizon:sup"..., 85, MSG_DONTWAIT, NULL, 0) = 85 <0.000041>23:05:15.936028 poll([{fd=8, events=POLLIN|POLLERR|POLLHUP}], 1, 60000) = 1 ([{fd=8, revents=POLLIN}]) <0.000019>23:05:15.936088 recvfrom(8, "+OKrn:0rn:1rn", 8192, MSG_DONTWAIT, NULL, NULL) = 13 <0.000018>23:05:15.936278 sendto(8, "*3rn$5rnSETNXrn$29rnhorizon:moni"..., 58, MSG_DONTWAIT, NULL, 0) = 58 <0.000057>23:05:15.936385 poll([{fd=8, events=POLLIN|POLLERR|POLLHUP}], 1, 60000) = 1 ([{fd=8, revents=POLLIN}]) <0.000019>23:05:15.936441 recvfrom(8, ":0rn", 8192, MSG_DONTWAIT, NULL, NULL) = 4 <0.000017>23:05:15.936505 rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0 <0.000017>23:05:15.936564 rt_sigaction(SIGCHLD, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0 <0.000023>23:05:15.936624 rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0 <0.000017>23:05:15.936672 nanosleep({tv_sec=1, tv_nsec=0}, ^Cstrace: Process 16701 detached <detached ...>
常用得参数也就这么几个,如果记不住,直接看帮助吧:)
以上就是普通用户启动 supervisor 报 HTTP 错误(strace)得详细内容,更多关于启动 supervisor 报 HTTP 错误得资料请关注之家其它相关内容!