CI指令碼異常退出問題定位

2021-08-10 10:44:31 字數 1208 閱讀 5460

在ci指令碼中,使用類似如下指令碼進行專案編譯的計時,但在執行過程中,有時會出現ci指令碼(命名為ci.sh)未完全執行的情況:

#!/bin/bash -e

sleep_time=$1

start_time=`date "+%s"`

# do sth, this sleep would simulate project compilation

sleep $sleep_time

end_time=`date "+%s"`

process_time=`expr \( end_time - start_time \)`

echo "---- process time(sec) are: " $process_time "seconds"

# ...

這個指令碼,只是模擬我們在ci中的程式,專案編譯前計時,專案編譯後再次計時,通過sleep休眠來模擬ci中專案編譯鎖消耗的時間,然後計算出消耗的時間。這個簡化的指令碼邏輯很簡單,我們通過以下命令來呼叫:

# ./ci.sh

---- process time(sec) are: 2 seconds

這樣執行好像並不會出錯,那實際ci中為什麼會出錯呢?

首先,我們發現,當出現指令碼未完全執行完成時,不會列印「process time(sec) are」這一句,也就是說錯誤是這句之前引起的。

另外,細心的朋友還會發現,在指令碼的首行,我們給bash使用了-e引數,這個引數的作用就是,一旦shell指令碼中任何一行出現了錯誤,shell指令碼就停止執行。所謂的出現錯誤,也就是這行語句的返回值為非零。那麼,ci指令碼未完全執行的原因,很可能就是因為某一行語句出現了錯誤,導致指令碼直接退出。

通過增加列印「echo $?」來列印上一行語句的執行結果,很快定位到報錯的語句在計算處理時間的這一行:

process_time=`expr \( end_time - start_time \)`
這一行看起來十分普通,只是簡單的用終止時間減去開始時間,然後賦值給process_time。為什麼會返回非0值呢?

原來,expr命令有乙個小小的trick,當expr表示式中的計算結果為0時,expr命令就會返回1,而不是通常的0。在我們實際的ci任務中,一旦某個專案編譯時間非常短,在1秒鐘內完成,那麼起止時間系統,其差值也就為0,因此,expr就會返回非零值,而ci指令碼也會因此而退出。

bat指令碼自動退出問題

用bat寫一些指令碼時,總是會遇到cmd自動退出的問題 cmd跑到盡頭,他就自動退出了,消失了,這本來也是正常。但是,我們有時候需要看一些日誌資訊,看看跑得正不正常。他這時候直接消失了,那不是很煩躁。所以需要在cmd的最後加乙個pause,他就會暫停下來啦 有時候呼叫一些第三方bin的api或者服務...

Xcode意外退出問題

遇見過幾次xcode意外退出問題,解決方法如下 1 xcode模擬器執行僵死在 attaching to 的解決法子,是因為當時更改了網路設定的高階選項的dns 2 關機重啟 3 更改product scheme edit scheme test裡面的debugger將lldb改為none 4 網上...

Linux優雅退出問題

先講乙個基本概念 如何在shell中終止乙個後台程序?kill的作用是向某個指定的程序或程序組傳送指定訊號,從而結束該程序 程序組。s選項可以指定要傳送的具體訊號,如果沒有指定,則預設傳送sigterm 15 訊號至指定程序 程序組,若程序沒有捕獲該訊號的邏輯,則sigterm的作用是終止程序。ki...