同时运行文件夹中的所有 Bash 脚本

同时运行文件夹中的所有 Bash 脚本

假设我.sh在一个文件夹 () 中有五个 Bash () 脚本my_folder,它们的名称如下:

script_1.sh
script_2.sh
script_3.sh
script_4.sh
script_5.sh

我怎样才能编写第六个 Bash 脚本或仅编写一个可以同时运行所有这些脚本的脚本?

我需要让这五个脚本同时开始运行,而不是一个接一个地运行。

答案1

GNUparallel非常适合这种事情。使用以下命令安装,sudo apt install parallel然后:

parallel -j0 ::: my_folder/*sh

控制-j并行运行的进程数,-j0表示“所有进程”。将其设置为其他值(例如-j20)可批量运行脚本。

答案2

要同时(并行)运行所有脚本,请使用:

script_1.sh &
script_2.sh &
script_3.sh &
script_4.sh &
script_5.sh &

要依次运行一个接一个(顺序),请使用:

script_1.sh &&
script_2.sh &&
script_3.sh &&
script_4.sh &&
script_5.sh

增强评论功能

如果您有 200 个脚本想要同时运行(这可能会使机器陷入困境),请使用此脚本:

#!/bin/bash
for Script in my_folder/*.sh ; do
    echo bash "$Script" &
done

使用以下命令将脚本属性设置为可执行:

chmod a+x /path/to/script.sh

第一次运行脚本时,它只会回显将要执行的 200 个脚本的名称。当您对所选名称感到满意时,请编辑脚本并更改此行:

    echo bash "$Script" &

到:

    bash "$Script" &

有三种方法可以从另一个脚本调用一个 bash 脚本,如下所答:

  1. 使另一个脚本可执行,将#!/bin/bash顶部的行以及文件所在的路径添加到$PATH环境变量中。然后你可以像普通命令一样调用它;

  2. 或者用源命令(别名为 .)调用它,如下所示:source /path/to/script;

  3. 或者使用bash命令执行:/bin/bash /path/to/script;

在 OP 的案例中,200 个脚本中有一个或多个不包含#!/bin/bash文件中的 shebang 第一行。因此必须使用选项 3。


200 个脚本同时运行

有人评论说这些脚本是否“同时运行”。在典型的 8 CPU 系统上,25 个脚本将同时共享一个 CPU,但每次只能执行一个脚本,直到其时间片(以毫秒为单位)用完。然后下一个作业将获得其应有的毫秒份额,然后是下一个作业,等等。

粗略地说,我们可以说 200 个作业在 8 个 CPU 上“并发”运行,但不是“同时”运行,这相当于每个 CPU 25 个作业:

线程状态.png

上面的图片和下面的评论来自Linux 内核调度器

时间切片.png

答案3

有一个可用于此的工具,请阅读man run-parts

例如,我这样做:

 run-parts ${visorhome}/pbackup.d/

在我的 Palm Pilot 备份脚本中。${visorhome}/pbackup.d/

01PopulateJpilot  02Extract_Pedometer  03URLs  04google  05Books  06Weight  07Sec  08Bkgm 50hardlinks

答案4

要同时运行目录*.sh中的所有脚本,使用以下命令:my_folderxargs

$ ls my_folder/*.sh | xargs -P0 -n1 bash

要将同时执行的脚本数量限制为10

$ ls my_folder/*.sh | xargs -P10 -n1 bash

相关内容