同时在文件夹中运行 Bash 脚本

aaa*_*aaa 10 bash scripts

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

script_1.sh
script_2.sh
script_3.sh
script_4.sh
script_5.sh
Run Code Online (Sandbox Code Playgroud)

我如何编写第六个 Bash 脚本或仅编写一个将开始一起运行所有这些脚本的 liner?

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

ter*_*don 12

GNUparallel非常适合这种事情。安装sudo apt install parallel然后:

parallel -j0 ::: my_folder/*sh
Run Code Online (Sandbox Code Playgroud)

-j吨并行多少进程运行控制,并-j0表示“所有的人”。将其设置为另一个值(例如-j20)以批量运行脚本。


Win*_*nix 9

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

script_1.sh &
script_2.sh &
script_3.sh &
script_4.sh &
script_5.sh &
Run Code Online (Sandbox Code Playgroud)

要一个接一个地(按顺序)运行,请使用:

script_1.sh &&
script_2.sh &&
script_3.sh &&
script_4.sh &&
script_5.sh
Run Code Online (Sandbox Code Playgroud)

增强评论功能

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

#!/bin/bash
for Script in my_folder/*.sh ; do
    echo bash "$Script" &
done
Run Code Online (Sandbox Code Playgroud)

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

chmod a+x /path/to/script.sh
Run Code Online (Sandbox Code Playgroud)

第一次运行脚本时,它只会回显将要执行的 200 个脚本的名称。当您高兴地选择了正确的名称时,编辑脚本并更改此行:

    echo bash "$Script" &
Run Code Online (Sandbox Code Playgroud)

到:

    bash "$Script" &
Run Code Online (Sandbox Code Playgroud)

您可以通过三种方式从另一个脚本调用 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