linux - 使用“&”在bash中并行处理并等待
问题描述
所以我试图从一台服务器转储很多表,然后将它们恢复到另一台服务器中。我想保持转储 1 接 1 并在转储完成时恢复它们。我不想通过同时运行超过 1 个恢复操作来压倒服务器。因此,为了实现我正在尝试使用第三个函数,该函数在调用另一个函数之前“等待”“恢复函数”完成。但我无法正确使用“等待”。该程序根本没有等待。
RESTORE(){
sleep 10 && echo "restore done" &
}
RESTORE_CALLER() {
echo "waiting for any restore with pid ${current_restore_pid}"
wait ${current_restore_pid}
echo "Calling restore"
RESTORE &
current_restore_pid=$!
}
DUMP(){
for ((i=0;i<5;i++));do
echo "dumping "
echo "restore caller"
RESTORE_CALLER &
done
}
DUMP
解决方案
管它:
seq 1 5 |
while read l; do
DUMP > "$l".dump
echo "$l"
done |
while read l; do
RESTORE < "$l".dump
echo "$l"
done
但是最好使用另一个描述符在管道之间传输数据,以便日志打印得很好:
seq 1 5 |
while read l; do
DUMP "$l"
echo "$l" >&3
done 3> >(
while read l; do
RESTORE "$l"
done
) |
cat
使用两个存根的示例执行:
DUMP() {
sleep 0.$(($RANDOM % 10))
echo "DUMPING $1"
}
RESTORE() {
sleep 0.$(($RANDOM % 10))
echo "RESTORING $1"
}
看起来不错:
DUMPING 1
RESTORING 1
DUMPING 2
RESTORING 2
DUMPING 3
DUMPING 4
DUMPING 5
RESTORING 3
RESTORING 4
RESTORING 5
最后| cat
需要同步进程替换。
它有什么好处,您可以使用类似工具xargs
轻松并行化DUMP
andRESTORE
函数,例如并行运行 3DUMP
秒和并行运行 2 秒RESTORE
:
DUMP() {
echo "DUMPING $1"
sleep 0.$(($RANDOM % 10))
echo "DUMPED $1"
}
RESTORE() {
echo "RESTORING $1"
sleep 0.$(($RANDOM % 10))
echo "RESTORED $1"
}
export -f DUMP RESTORE
seq 1 5 |
xargs -n1 -P3 bash -c 'DUMP "$1"; echo "$1" >&3' -- 3> >(
xargs -n1 -P2 bash -c 'RESTORE "$1"' --
) | cat
它看起来更酷:
DUMPING 1
DUMPING 2
DUMPING 3
DUMPED 3
RESTORING 3
DUMPING 4
DUMPED 4
RESTORED 3
RESTORING 4
DUMPING 5
DUMPED 1
RESTORING 1
RESTORED 4
DUMPED 2
RESTORING 2
DUMPED 5
RESTORED 2
RESTORING 5
RESTORED 1
RESTORED 5
推荐阅读
- c# - 如何在表上填充数据 C# wpf
- youtube - YouTube 数据 API 视频时长延长 1 秒
- string - 是否可以在 VB Net 中的 Double Var 中添加 0
- visual-studio-code - 如何使用环境变量为 pytest 配置 VS 代码
- mongodb - 如何使用logstash将mongodb集合与elasticseatch索引同步?
- docker - 如何在 shell 脚本中使用 docker env 文件?
- python - Python解析文件删除部分
- wordpress - 在感谢页面中编码 URL 参数并使用 Gravity 表单字段对其进行解码
- unity3d - unity NullReferenceException Hashset 添加
- python - 子进程中的 Python 函数