執行一系列進程的守護程序服務(平衡分佈)

執行一系列進程的守護程序服務(平衡分佈)

我有以下問題。我有一個在後台運行的機器學習過程。更好的是,我有很多(假設有 5 個)我想運行它們。它們中的每一個都消耗 CPU 和 GPU 的電量,因此希望在特定的時間段(即 1 小時,實際上腳本本身能夠在 1 小時後關閉)內只運行其中一個,然後停止它並運行另一個一。這樣我就可以在機器同時運行幾天的同時訓練所有這些人。

挑戰如下:我想讓它們平衡/旋轉地運行。我希望腳本/處理程序確保在運行第一個腳本並重新啟動機器(或重新啟動新貴服務或類似的操作)後運行第二個腳本/處理程序,而不是運行第一個,然後運行第二個,第三個等。我想避免這樣的情況:每次重新啟動後,它都會以相同的進程開始,並且大部分時間都花在第一個進程上,最少花在最後一個進程上。

任何人都可以建議一個開箱即用的解決方案(除了編寫我自己的腳本/處理程序,這顯然很容易,但我想要一些經過徹底測試的東西,而不是我自己需要管理的東西)。

答案1

這取決於您希望它有多強大。在循環列表中運行“下一個”程序的簡單解決方案可能如下所示:

#! /usr/bin/env bash

programs=(program1 program2 program3 program4 program5)
state=$HOME/.${0#*/}_state

if [ -f "$state" ]; then
    read idx <"$state"
    if expr "$idx" : '[0-9][0-9]*$' >/dev/null; then
        let idx=(idx+1)%${#programs[@]}
    else
        let idx=0
    fi
else
    let idx=0
fi
printf '%d\n' "$idx" >"$state" || exit 1

exec "${programs[$idx]}" "$@"

如果你想要更健壯的東西,你需要鎖定,並且可能將狀態保存在資料庫中。

相關內容