0

我在后台启动了两个进程。我怎样才能绝对保证wait $pid2 $pid3在启动 3.sql 之前可以正常工作并等待完成?在确保 2.sql 完全完成之前,我无法关闭 3.sql。有人可以告诉我另一种检查方法吗?

#!/usr/bin/ksh
1.sql
2.sql &
3.sql &
pid2=$!
pid3=$!
wait $pid2 $pid3
4.sql
4

2 回答 2

2

如果这是整个脚本,您可以通过执行简单的操作来简化它wait

#!/usr/bin/ksh
1.sql
2.sql &
3.sql &
wait
4.sql

如果要显式等待,则需要正确设置 pid。您正在等待3.sql只是因为您2.sql在后台运行,但在后台运行之前不收集它的 pid 3.sql。你应该有:

#!/usr/bin/ksh
1.sql
2.sql &
pid2=$!
3.sql &
pid3=$!
wait $pid2 $pid3
4.sql
于 2013-08-17T20:13:00.090 回答
1

您当前使用的技术似乎是合法的。如果由于某种原因您不信任操作系统或 shell,您可以让脚本在完成后打印一些输出,并捕获该输出 - 例如:

rm -f 2.out 3.out
2.sql > 2.out &
3.sql > 3.out &
...
wait $pid2 $pid3
if [ "$(cat 2.out)" != "done" ] || [ "$(cat 3.out)" != "done" ]; then
    echo "2.sql and 3.sql didn't really finish - exiting" >&2
    exit 1
fi
4.sql

(您可以将ifandexit变成while带有 short的 a sleep,这将首先消除对的需要wait。)

于 2013-08-17T20:11:39.640 回答