生成 Bash 脚本并将其作为命令行参数传递给程序

生成 Bash 脚本并将其作为命令行参数传递给程序

我有一个 python 脚本,它获取 1 个命令行参数

python arg

现在我想要一个bash脚本:

  • python arg &使用参数 arg=000进行调用
  • 做这个x-次

因此:

python 000 &
python 001 &
...
python 00x &

如果其中一个进程完成,脚本应该派生一个新进程

python 00x+1 &

直到一个数字N


脚注:

  • 我非常清楚,我正在尝试做的这听起来像是一个丑陋的解决方案 - 但是我被迫通过各种原因这样做,这超出了我的范围
  • 我知道我把所有的工作都留给了社区,但是我所有的谷歌搜索和浏览都导致脚本为零,因此我不得不保持原样。

编辑:我需要一个不使用的解决方案parallel

答案1

听起来您想并行运行多个 Python 脚本实例,但一次只能运行这么多实例,当一个实例完成时,再启动另一个实例。有一个方便的实用程序,称为“parallel”,可与命令“seq”结合使用以生成数字列表。

 seq -f '%03.0f' 0 N | parallel -j x "python {}"

在上面的例子中,将 N 替换为上限。将 x 替换为同时运行的最大脚本数量。

seq 生成数字列表。

$ seq 5
1
2
3
4
5

$ seq 0 5
0
1
2
3
4
5

$ seq -f '%03.0f' 0 5
000
001
002
003
004
005

最后一部分看起来像您想要使用的数字序列... 5 是您可以更改的任意端点。

并行 -jx “命令{}” 每次同时运行 x 个命令副本,用 seq 生成的列表中的一个值替换 {}。因此,如果您有一个 000-100 的序列并提供 -j 3,它将运行:

 python 000
 python 001
 python 002

同时执行所有任务。当其中一个任务退出时,假设“python 001”首先完成,它将启动“python 003”。假设“python 000”接下来完成,它将接着替换“python 004”,依此类推,直到完成所有 101 个任务。

显然,您不想将 -j 设得太高,否则会导致系统超载。

seq 是一个非常标准的 Linux 命令。parallel 是可选包,可通过系统的包管理器安装。奇怪的是,基于 RedHat 的系统不包含它,但您可以从官方网站获取源代码和二进制文件:

https://www.gnu.org/software/parallel/

答案2

基于上一个答案,但不是使用 GNU parallel,而是使用带有选项 -P 选项的标准命令“xargs”:

seq -f '%03.0f' 0 999 | xargs -n 1 -P 4 python

尝试以下方法来查看进程如何并行运行:

seq 0 10 | shuf | xargs -n 1 -P 3 -I % sh -c "echo start %; sleep %; echo done %"

相关内容