本文介绍Custom Runtime运行环境常见的错误类型及排查方法。
实例启动失败(Failed to start function instance)
报错示例
The function cannot be started. Failed to start function instance. Error: the file /code/bootstrap is not exist
报错排查
函数实例启动失败,一般是启动命令异常或者启动命令不存在。
如果未设置启动命令,函数计算默认使用
/code/bootstrap
作为启动命令。如果代码包中没有该文件,可增加/code/bootstrap
脚本,或修改启动命令。如果已设置启动命令,请参考报错信息中的
Error: the file xxx is not exist
,确认该文件是否存在。
关于设置启动命令的具体操作,请参见基本原理。
实例健康检查失败(Function instance health check failed)
报错示例
Function instance health check failed on port 9001 in 120 seconds.\nLogs:
报错排查
函数实例健康检查失败,一般是代码中监听的IP地址或者端口设置错误导致。函数实例启动后,平台会根据函数配置的端口进行4层连通性检查,若在超时时间内检查不通过,则返回Function instance health check failed
报错。
监听地址和端口必须满足以下条件。
监听地址
代码中的监听IP地址必须设置为
0.0.0.0
或*
,不能设置为127.0.0.0
或localhost
。监听端口
监听端口必须和函数配置中的端口保持一致。Custom Runtime运行时默认监听端口为
9000
。如果使用默认端口,请确保代码中HTTP Server监听的端口也是
9000
。如果设置了监听端口,请确保代码中HTTP Server监听的端口与其一致。
关于设置监听端口的具体操作,请参见HTTP Server配置要求。
实例进程异常退出(Function instance exited unexpectedly)
报错示例
Function instance exited unexpectedly(code 2, message:no such file or directory) with start command '/code/bootstrap '.
Logs:
Function instance exited unexpectedly
:表示实例启动进程异常退出。code 2, message:no such file or directory
:表示实例启动进程的Linux退出码和该退出码的含义。with start command '/code/bootstrap '
:表示该实例的启动命令。
进程退出码及其含义仅作为问题排查的参考,不能完全确定实例退出原因,因为该退出码可能是代码中实现,与Linux退出码含义不完全相匹配。
报错排查
启动命令没有可执行权限
The function cannot be started. Function instance exited unexpectedly(code 13, message:permission denied) with start command '/code/bootstrap '.
如果实例启动命令没有可执行权限,报错信息中的退出码一般为
code 13, message:permission denied
。可以在打包代码前,执行chmod 755 bootstrap
、chmod 777 bootstrap
或chmod +x bootstrap
赋予文件的可执行权限。文件不存在
Function instance exited unexpectedly(code 2, message:no such file or directory) with start command 'python3 not_exist_file.py '. Logs:xxx
如果启动参数中的文件不存在,则报错信息中的退出码一般为
code 2, message:no such file or directory
。特殊情况下,报错信息中的退出码可能不是code 2, message:no such file or directory
或无退出码,此时,需要根据报错日志进行排查。下文列举不同启动命令下,文件不存在的报错信息。
文件格式错误
Function instance exited unexpectedly(code 8, message:exec format error) with start command '/code/bootstrap '. Logs:
Custom Runtime运行时环境为
x86-64
架构的Linux,需要保证启动文件兼容该系统环境。如果启动命令为Shell脚本,需要确保文件为Linux格式,并且文件包含Shell的解释行#!
。如果启动命令为二进制可执行文件,需要确保该文件为兼容Linux系统的ELF文件格式。具体信息如下。启动命令Shell脚本解释行错误
当Shell脚本缺少首行解释行,或者解释行错误时,实例退出码一般为
8 exec format error
。因此,需要在文件首行添加正确的解释行。如您需要使用Bash运行该脚本,可以在文件首行加上命令
#!/usr/bin/env bash
或#!/bin/bash
,推荐使用#!/usr/bin/env bash
。在Custom Runtime系统环境中,/bin/sh
默认为/bin/bash
,因此,也可以使用命令#!/usr/bin/env sh
或#!/bin/sh
。启动命令Shell脚本为Windows格式
执行以下测试脚本。
#!/usr/bin/env bash node /code/index.js
报错如下。
Function instance exited unexpectedly(code 127, message:key has expired) with start command '/code/bootstrap '. Logs:/usr/bin/env: ‘bash\r’: No such file or directory
在错误日志中
bash\r
表示在bash
后面多余一个字符\r
。Unix文件换行符为\n
,Windows文件换行符为\r\n
,因此,该文件是Windows格式。如果您的脚本在Windows系统下创建,需要将脚本格式转换为Unix格式。您可以在Linux系统下通过执行命令
dos2unix
进行转换,或者使用函数计算的WebIDE进行转换。更多信息,请参见如何使用函数计算的WebIDE转换文件格式?。启动命令为二进制可执行文件
如果启动命令为可执行文件,请确保该文件为兼容Linux系统的ELF文件格式。例如,在一台M1芯片的Mac机器上,使用默认配置
GOOS=darwin GOARCH=arm64
编译Golang代码,然后进行打包上传并测试,报错信息如下所示。Function instance exited unexpectedly(code 8, message:exec format error) with start command './main '. Logs:
实例退出码为
8 exec format error
,表示文件格式错误。需要在编译时添加配置GOOS=linux GOARCH=amd64
。具体信息,请参见编译部署代码包。
常见退出码
除了以上列举的退出码以外,还有其他的常见错误情况,具体信息如下。
Exit Code 137
程序收到信号SIGKILL异常退出,一般情况是
OOMKilled(Out of Memory)
问题,程序因内存不足而退出。此时,可以尝试调大函数的内存规格。
更多信息
如果遇到的错误类型未包含在本文列举的错误列表中,请参见Custom Runtime FAQ进一步排查原因。