Answers:
GNU parallel
非常适合这种事情。使用安装,sudo apt install parallel
然后:
parallel -j0 ::: my_folder/*sh
该-j
吨并行多少进程运行控制,并-j0
表示“所有的人”。将其设置为另一个值(例如-j20
),以分批运行脚本。
parallel
命令moreutils
。示例用法:(parallel -j 20 -- my_folder/*.sh
与GNU不同parallel
,-j0
它将一次运行一个脚本)。
sudo apt install parallel
它将用/usr/bin/parallel
GNU parallel中的一个替换该文件。因此,只要您安装了它(如我的回答所示),它就应该可以正常工作。
parallel
在编写建议GNU并行的答案时,尝试使用手册中的命令失败时,我发现了这很困难。
要同时(并行)运行所有脚本,请使用:
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.。
对于它们是否“同时运行”提出了评论。在典型的8 CPU系统上,25个脚本将同时共享一个CPU,但是一次只能执行一个脚本,直到时间片(以毫秒为单位)用完为止。然后,下一个作业将获得其应有的毫秒份额,然后是下一个作业,依此类推,等等。
粗略地说,我们可以说200个作业在8个CPU上“同时”运行,而不是“同时”运行,相当于每个CPU 25个作业:
上图和下面来自Linux内核调度程序的注释
bash
调用脚本的前缀。
有一个工具可以阅读man run-parts
。
例如,我这样做:
run-parts ${visorhome}/pbackup.d/
在我的Palm Pilot备份脚本中。 ${visorhome}/pbackup.d/
:
01PopulateJpilot 02Extract_Pedometer 03URLs 04google 05Books 06Weight 07Sec 08Bkgm 50hardlinks
run-parts
将不会运行脚本(它们的名称中带有点号:my_folder/*.sh
使用以下命令同时运行目录中的所有*.sh
脚本my_folder
xargs
:
$ ls my_folder/*.sh | xargs -P0 -n1 bash
将并发执行的脚本数限制为10
:
$ ls my_folder/*.sh | xargs -P10 -n1 bash
ls
在脚本中使用输出是一个不好的做法。使用find
更加安全。这是这里的第一项:mywiki.wooledge.org/BashPitfalls#for_f_in_.24.28ls_.2A.mp3.29