如何检测Linux中哪个并行进程先结束?

How to detect which parallel process ends first in Linux?

我有 2 个程序:knownunknown。我知道 known 程序的输出(这是常量),但我不知道 unknown 程序的输出(在某些情况下可能与 known 相同) .我想 运行 它们在 Linux 机器上并行,这样它们都可以获得相同的 CPU 功率。我为此找到了几种解决方案,但我面临的问题是检测哪个程序先结束。

我试过 echo $(./known & ./unknown) 效果很好,但如果两个输出相同,我无法检测哪个先结束。

我也试过 echo $(./known & time ./unknown > /dev/null) 但由于某种原因 time 命令的输出总是在 known 命令之前打印,即使我故意使 unknownunknownknown(所以它应该是相反的)。输出是这样的:

echo $(./known & time ./unknown >/dev/null)

real    0m2.054s
user    0m3.072s
sys     0m0.000s
b

这里,'b' 是 known 命令的输出,我希望它首先被打印出来,因为它是更快的程序。

那么知道如何检测哪个进程先结束吗?

抱歉 post 我自己的回答,但我刚刚找到了解决方案。这有效:

echo $(./known & echo x$(./unknown))

这里,'x'是两个输出的区别,所以即使它们相同,我也知道哪个先打印。

如果您有更好的解决方案,请随时回答或评论。谢谢

这可以通过捕获 kill 信号来完成,如下所示。

假设有一个 known.sh 脚本

sleep 4
d=$(date '+%H:%M:%S')
echo "known process $d [parent PID: ]"
kill -SIGUSR1 

一个unknown.sh脚本

sleep 1
d=$(date '+%H:%M:%S')
echo "unknown process $d [parent PID: ]"
kill -SIGUSR2 

最后,master.sh 脚本将等待 SIGUSR1 和 SIGUSR2 信号

trap 'echo "$k ended"' SIGUSR1 SIGUSR2

echo "I'm the master [PID $$]"
k=$(time ./unknown.sh $$ &)
k=$(time ./known.sh $$ &)
sleep 5

master.sh 的输出将是

I'm the master [PID 3205]

real    0m1.005s
user    0m0.004s
sys     0m0.001s
unknown process 00:53:57 [parent PID: 3205] ended

real    0m4.004s
user    0m0.003s
sys     0m0.001s
known process 00:54:01 [parent PID: 3205] ended