假设我.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)以批量运行脚本。
要同时(并行)运行所有脚本,请使用:
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 脚本,如下所示:
使另一个脚本可执行,
#!/bin/bash在顶部添加一行,以及文件到$PATH环境变量的路径。然后就可以作为普通命令调用了;或与源命令调用它(别名)是这样的:
source /path/to/script;或者使用bash命令来执行它:
/bin/bash /path/to/script;
在 OP 的情况下,200 个脚本中的一个或多个脚本不包含#!/bin/bash文件中的 shebang第一行。因此,必须使用选项 3。
已经提出了关于它们是否“同时运行”的评论。在典型的 8 CPU 系统上,25 个脚本将同时共享一个 CPU,但一次只会执行一个脚本,直到时间片(以毫秒为单位)用完为止。然后下一个工作将获得公平的毫秒份额,然后下一个工作,依此类推。
笼统地说,我们可以说 200 个作业在 8 个 CPU 上“同时”但不是“同时”运行,这相当于每个 CPU 25 个作业:
上面的图片和下面的评论来自Linux 内核调度程序
| 归档时间: |
|
| 查看次数: |
3733 次 |
| 最近记录: |