本文介绍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监听的端口与其一致。 
 
关于设置监听端口的具体操作,请参见创建函数。
实例进程异常退出(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进行转换。更多信息,请参见如何使用函数计算的Web IDE转换文件格式?。
- 启动命令为二进制可执行文件 - 如果启动命令为可执行文件,请确保该文件为兼容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进一步排查原因。