您好,我正在编写一个 bash 脚本,其中我必须使用 ipset-restore 命令恢复大约 8 个以上的大 ip 集。
实际上我的 shell 脚本基本上有一个类似的列表
ipset-restore < 列表 1.txt ipset-restore < 列表 2.txt ipset-restore < 列表 3.txt ...
以这种方式执行操作非常慢,并且因为机器有资源并且 ipset 是多线程的,可以并行执行各种操作,所以我想一次执行许多 ipset-restore。
我想到使用禁止但是这样做会让我无法在执行新指令之前查看进程是否已经完成。
我需要每个过程都完成之后才能继续下一步。
(基本上我需要等待最慢的才能继续)。
奖励:它存在一个 Linux 包来执行此操作,同时还监控资源,以便自动处理进程的产生而不占用所有资源?
答案1
要使所有作业并行运行,您应该将它们作为后台作业运行,而主脚本继续创建所有作业。这可以通过以下命令完成:
process &
有关详细信息,请参阅 在后台和前台运行 Linux 命令。
一旦所有命令都已发出并在后台运行,你可以使用等待命令,其描述为:
如果调用 wait 实用程序时没有操作数,它将等待,直到调用 shell 已知的所有进程 ID 都终止并以零退出状态退出。
如果你遇到等待太多进程的问题,你可以使用一个解决方案,保留已启动进程的 PID 并只等待它们。请参阅帖子 如何在 bash 中等待几个子进程完成,并在任何子进程以代码 !=0 结束时返回退出代码 !=0?。