本文介紹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
報錯排查
函數執行個體啟動失敗,一般是啟動命令異常或者啟動命令不存在。
如果未設定啟動命令,Function Compute預設使用
/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
進行轉換,或者使用Function Compute的WebIDE進行轉換。更多資訊,請參見如何使用Function Compute的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進一步排查原因。