容器异常退出状态码
当容器启动失败或终止时,K8s事件中将会打印容器异常退出状态码(Exit Code)来报告容器异常的原因。本文将介绍如何通过事件中打印的Exit Code进一步定位容器异常的根本原因。
查看容器异常退出状态码
您可使用kubectl连接集群,并通过以下命令查询Pod详细状态:
kubectl describe pod {pod name} Containers:
container-1:
Container ID: ...
Image: ...
Image ID: ...
Ports: ...
Host Ports: ...
Args: ...
State: Running
Started: Sat, 28 Jan 2023 09:06:53 +0000
Last State: Terminated
Reason: Error
Exit Code: 255
Started: Sat, 28 Jan 2023 09:01:33 +0000
Finished: Sat, 28 Jan 2023 09:05:11 +0000
Ready: True
Restart Count: 1 退出状态码说明
容器退出状态码的范围为0~255之间:
- 0表示正常退出。
- 一般由于程序自身原因导致的异常退出,状态码区间在1~128。在特殊场景下,程序也可以使用129~255区间的状态码。
- 由于外界中断导致程序退出时,状态码区间在129~255。当操作系统给程序发送中断信号时,程序退出时的状态码为操作系统的中断信号值加128。例如, SIGKILL(强制停止)的中断信号值为9,那么程序退出状态码则为9+128 =137。
- 当指定的状态码不在0~255范围内时(例如使用exit(-1)),将自动转化至0~255范围内。
code % 256
当指定的状态码为负数,转换公式如下:
256 - (|code| % 256)
更多退出状态码说明请参见Exit Codes With Special Meanings。
常见的容器异常退出状态码
容器异常退出状态码 | 名称 | 含义 |
|---|---|---|
0 | 正常退出 | 表示容器正常退出。该状态码不一定表示存在异常,例如,当容器内没有进程时,也会出现退出状态码为0的场景。 |
1 | 一般程序错误 | 引起该异常状态的原因较多,大多由于程序自身错误导致,需要进一步通过容器日志定位原因。例如在ARM节点上运行X86镜像时,会出现该错误。 |
125 | 容器未能运行 | 发生这种情况的常见原因有如下几种:
|
126 | 命令调用错误 | 镜像中调用的命令无法执行,例如文件权限不足或文件不可执行。 |
127 | 找不到文件或目录 | 无法找到镜像中指定的文件或目录。 |
128 | 无效的退出参数 | 容器退出但未提供有效的退出代码,可能的原因有多种,需要进一步定位原因。例如containerd节点上运行的应用尝试调用docker命令。 |
137 | 立即终止(SIGKILL) | 表示程序被SIGKILL信号终止,常见的原因有如下几种:
|
139 | 分段错误(SIGSEGV) | 表示容器收到了来自操作系统的SIGSEGV信号,由于容器试图访问无权限的内存位置引起。 |
143 | 优雅终止(SIGTERM) | 表示容器在主机指示后正确关闭。一般来说,退出码143不需要进行故障排除。 |
255 | 状态码超出范围 | 表示容器退出状态码超出范围。例如,可能是设置异常退出使用exit(-1)导致的,而-1将会自动转换成255。 出现该异常时无法判断原因,需要进一步通过容器日志定位原因。 |
Linux标准中断信号
您可以使用kill -l命令查看Linux操作系统中信号以及对应的数值。
信号(Signal) | 状态码(Value) | 动作(Action) | 描述(Commit) |
|---|---|---|---|
SIGHUP | 1 | Term | 用户终端连接(正常或非正常)结束时发出 |
SIGINT | 2 | Term | 程序终止信号,通常由终端发出中断指令,例如键盘输入Ctrl+C |
SIGQUIT | 3 | Core | 和SIGINT类似,由终端发出退出指令,通常是键盘输入Ctrl+\来控制 |
SIGILL | 4 | Core | 非法指令,通常是因为可执行文件本身出现错误 |
SIGABRT | 6 | Core | 调用abort函数时产生的信号,进程会非正常结束 |
SIGFPE | 8 | Core | 发生浮点运算错误,出现除数为0等其它算术错误时也会产生 |
SIGKILL | 9 | Term | 终止任何进程 |
SIGSEGV | 11 | Core | 试图访问无权限的内存位置 |
SIGPIPE | 13 | Term | 管道断开信号 |
SIGALRM | 14 | Term | 时钟定时信号 |
SIGTERM | 15 | Term | 进程结束信号,通常是程序自行正常退出 |
SIGUSR1 | 10 | Term | 用户在应用程序中自行定义的信号 |
SIGUSR2 | 12 | Term | 用户在应用程序中自行定义的信号 |
SIGCHLD | 17 | Ign | 子进程结束或中断时产生该信号 |
SIGCONT | 18 | Cont | 让一个暂停(stopped)的进程继续执行 |
SIGSTOP | 19 | Stop | 暂停进程的执行 |
SIGTSTP | 20 | Stop | 停止进程的运行 |
SIGTTIN | 21 | Stop | 后台进程从终端读取输入值 |
SIGTTOU | 22 | Stop | 后台进程从终端读取输出值 |

