假设我.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 脚本,如下所答:
使另一个脚本可执行,将
#!/bin/bash
顶部的行以及文件所在的路径添加到$PATH
环境变量中。然后你可以像普通命令一样调用它;或者用源命令(别名为 .)调用它,如下所示:
source /path/to/script
;或者使用bash命令执行:
/bin/bash /path/to/script
;
在 OP 的案例中,200 个脚本中有一个或多个不包含#!/bin/bash
文件中的 shebang 第一行。因此必须使用选项 3。
200 个脚本同时运行
有人评论说这些脚本是否“同时运行”。在典型的 8 CPU 系统上,25 个脚本将同时共享一个 CPU,但每次只能执行一个脚本,直到其时间片(以毫秒为单位)用完。然后下一个作业将获得其应有的毫秒份额,然后是下一个作业,等等。
粗略地说,我们可以说 200 个作业在 8 个 CPU 上“并发”运行,但不是“同时”运行,这相当于每个 CPU 25 个作业:
上面的图片和下面的评论来自Linux 内核调度器
答案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_folder
xargs
$ ls my_folder/*.sh | xargs -P0 -n1 bash
要将同时执行的脚本数量限制为10
:
$ ls my_folder/*.sh | xargs -P10 -n1 bash