我有一个我想要运行的(bash)命令列表:
<Command 1>
<Command 2>
...
<Command n>
每个命令都需要很长时间才能运行,有时在看到(例如)<Command 1>
的输出后,我想更新<Command 5>
的参数,或者添加一个新{ {1}}在列表中的任意位置。但我希望能够随时离开我的机器,让它继续完成我对列表的最后更新。
这与此处的问题类似:Edit shell script while it's running。其中一些答案可以提供服务,但是这个问题还有一个额外的限制,即想要编辑脚本文件本身,我怀疑有一个更简单的答案,因为我没有那个确切的约束。
我目前的解决方案是通过调用第二个脚本来结束我的脚本。我可以在第一个文件运行时编辑第二个文件,这允许我将新命令附加到列表的末尾,但是我无法对第一个文件中的命令列表进行任何更改。一旦在第二个文件中开始执行,我就无法进行任何更改。但我经常停止我的脚本插入更新,这有时意味着停止一个几乎完成的长命令,只是为了在我离开机器一段时间之前我可以更新列表中的后续项目。我当然可以用这种方式将许多文件链接在一起,但这似乎是一个混乱(希望)有一个简单的解决方案。
答案 0 :(得分:2)
这是一个概念性答案,而不是我提供完整代码的答案。我的想法是运行Redis(Redis description here) - 安装非常简单 - 并将其用作数据结构服务器。在您的情况下,数据结构将是一个作业列表。
因此,您基本上将每个作业添加到Redis列表中,您可以在命令行中使用LPUSH
执行此操作:
echo "lpush jobs job1" | redis-cli
然后,如果您愿意,您可以并行启动一个或多个工作人员并且他们坐在一个循环中,执行重复的BLPOP
个工作(阻止弹出,等待有工作)从列表中处理它们:
#!/bin/bash
while :; do
job=$(echo brpop jobs 0 | redis_cli)
do $job
done
然后,您可以在工作人员使用删除和插入的情况下修改列表。
示例here。
答案 1 :(得分:0)
我想说将要运行的每个命令放在一个文件和主文件列表中的所有命令文件
ex:main.sh
#!/bin/bash
# Here you define the absolute path of your script
scriptPath="/home/script/"
# Name of your script
scriptCommand1="command_1.sh"
scriptCommand2="command_2.sh"
...
scriptCommandN="command_N.sh"
# Here you execute your script
$scriptPath/$scriptCommand1
$scriptPath/$scriptCommand2
...
$scriptPath/$scriptCommandN
我认为当1运行时,您可以修改另一个,因为它们是外部文件