如何在 Bash 脚本中同时运行两个不同的长时间运行的命令?

如何在 Bash 脚本中同时运行两个不同的长时间运行的命令?

作为迁移脚本的一部分,我必须对数十万个文件执行 chmod 和 chown 操作。每个命令大约需要一个半小时才能完成。我意识到这两个操作可以同时运行,从而缩短了运行时间,我通过在 shell 中进行测试证实了这一点。

我知道使用“&”将命令推送到后台的技巧,但我需要确保两个过程都完成,然后才能继续执行脚本的其余部分。

谢谢

答案1

使用wait命令。

此演示:

#!/bin/bash
echo $SECONDS
sleep 12&
sleep 15&
jobs
wait
echo $SECONDS
echo "jobs are done"

产生以下输出:

0
[1]-  Running                 sleep 12 &
[2]+  Running                 sleep 15 &
15
jobs are done

在输出最后两行之前有十五秒的停顿。

答案2

您可以捕获 pid 并使用等待。

chmod options
CHMODPID=$!
chown options
CHOWNPID=$!
wait $CHMODPID
wait $CHOWNPID

(应该适用于 bash;其他 shell 类型的详细信息可能有所不同)

答案3

如果您需要确保两个进程都已完成,然后再继续下一步,一个简单的解决方案就是将一些内容写入文件并检查它。只需对文件执行 head 或 cat(默认值为 0)并在第一行添加 1。如果检测到 2,则两个进程都已完成。当然,添加应该在脚本的最底部完成。

相关内容