如何检测Linux中哪个并行进程先结束?
How to detect which parallel process ends first in Linux?
我有 2 个程序:known
和 unknown
。我知道 known
程序的输出(这是常量),但我不知道 unknown
程序的输出(在某些情况下可能与 known
相同) .我想 运行 它们在 Linux 机器上并行,这样它们都可以获得相同的 CPU 功率。我为此找到了几种解决方案,但我面临的问题是检测哪个程序先结束。
我试过 echo $(./known & ./unknown)
效果很好,但如果两个输出相同,我无法检测哪个先结束。
我也试过 echo $(./known & time ./unknown > /dev/null)
但由于某种原因 time
命令的输出总是在 known
命令之前打印,即使我故意使 unknown
比 unknown
慢known
(所以它应该是相反的)。输出是这样的:
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
我有 2 个程序:known
和 unknown
。我知道 known
程序的输出(这是常量),但我不知道 unknown
程序的输出(在某些情况下可能与 known
相同) .我想 运行 它们在 Linux 机器上并行,这样它们都可以获得相同的 CPU 功率。我为此找到了几种解决方案,但我面临的问题是检测哪个程序先结束。
我试过 echo $(./known & ./unknown)
效果很好,但如果两个输出相同,我无法检测哪个先结束。
我也试过 echo $(./known & time ./unknown > /dev/null)
但由于某种原因 time
命令的输出总是在 known
命令之前打印,即使我故意使 unknown
比 unknown
慢known
(所以它应该是相反的)。输出是这样的:
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