我有以下问题。我有一个在后台运行的机器学习过程。更好的是,我有很多(假设有 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]}" "$@"
如果你想要更健壮的东西,你需要锁定,并且可能将状态保存在数据库中。