簡體   English   中英

Jenkins運行的Shell腳本創建了非終止過程

[英]Shell script run by Jenkins creates non-terminating process

我正在嘗試使用Jenkins創建一個特殊的git存儲庫。 我創建了一個僅執行shell腳本的自由風格項目。 當我在沒有詹金斯的情況下手動執行此腳本時,它就可以正常工作。 但是,它與詹金斯的行為大相徑庭。

# this will remove all subtrees
git log | grep git-subtree-dir | tr -d ' ' | cut -d ":" -f2 | sort | uniq | xargs -I {} bash -c 'if [ -d $(git rev-parse --show-toplevel)/{} ] ; then rm -rf {}; fi'

rm -rf .git

如果這部分是由詹金斯執行的,則在控制台輸出中,我會看到這種錯誤:

rm: cannot remove '.git/objects/pack/pack-022eb85d38a41e66ad3f43a5f28809a5a3ee4a0f.pack': Device or resource busy
rm: cannot remove '.git/objects/pack/pack-05630eb059838f149ad30483bd48d37f9a629c70.pack': Device or resource busy
rm: cannot remove '.git/objects/pack/pack-26f510b5a2d15ba9372cf0a89628d743811e3bb2.pack': Device or resource busy
rm: cannot remove '.git/objects/pack/pack-33d276d82226c201eedd419e5fd24b6b906d4c03.pack': Device or resource busy

我這樣修改了腳本的這一部分:

while true
do
    if rm -rf .git ; then
        break
    else
        continue
    fi
done

但這無濟於事。 在任務管理器中,我看到一個git進程並沒有終止。 我通過大量的谷歌搜索聯想了所說的腳本,但我不太了解發生了什么。

Jenkins在IIS之后的Windows Server 2012上運行; Shell腳本由git隨Windows一起提供的bash執行。

1 /確保您的路徑正確,並且在jenkins作業啟動過程中沒有出現引號/雙引號轉義。

2 /您的命令行有點方便,無法正確,安全地進行評估。 將您的命令放在常規腳本中,以#!/bin/bash開頭,而不是通過命令行。

xargs -I {} bash -c 'if [ -d $(git rev-parse --show-toplevel)/{} ] ; then rm -rf {}; fi'

成為

xargs -I {} /path/myscript.sh {}

#!/bin/bash

rev-parse="$(git rev-parse --show-toplevel)"
wait

if [ -d ${rev-parse}/${1} ] ; then 
   rm -rf ${1}
fi

請注意,您的腳本確實是不安全的,因為您對rm -rf一個參數進行了評估,甚至在…之前都不對其進行評估!

3 /您可以在gitrm之間添加一個wait ,以等待git進程結束

4 /將您的git命令記錄到日志文件中,並帶有重定向>> /tmp/git-jenkins-log

5 /將所有這些命令放在腳本中(請參閱#2)

以下是在rm -rf失敗的情況下的無限循環

while true
do
    if rm -rf .git ; then
        break
    else
        continue
    fi
done

實際上,可以在forwhile循環中使用continue獲取下一個條目,但是在此while循環中,它將永遠運行相同的rm命令。

好吧,另外,我能夠通過從其他用戶運行腳本來解決問題。 在Windows上,默認情況下,Jenkins從用戶SYSTEM執行所有作業。 我不知道為什么它會影響腳本的行為,但是可以通過專門創建的用戶帳戶使用psexec運行它。

萬一有興趣的話,我可以這樣做:

psexec -accepteula -h -user Jenkins -p _password_ "full/path/to/bash.exe" full/path/to/script.sh

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM