【问题标题】:How to detect which parallel process ends first in Linux?如何检测Linux中哪个并行进程首先结束?
【发布时间】:2015-03-16 09:02:36
【问题描述】:

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

我尝试了echo $(./known & ./unknown),它工作正常,但如果两个输出相同,我无法检测哪个先结束。

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

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

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

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

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

【问题讨论】:

  • echo $(./known&&echo "known first" & ./unknown&&echo "unknown first")
  • @JID 谢谢,但有一个问题。像这样的东西弹出:[1] 23191。我该如何摆脱它?
  • @JID 此外,由于某种原因,稍后结束的输出显示在命令输入行(user@pc:~$...)中,按 后显示其他一些不需要的文本,例如[1]+ Done 。这很乱:(
  • 不要运行后台命令...
  • @JID 抱歉,我没听懂。有没有办法在前台做到这一点?

标签: performance bash time command-line parallel-processing


【解决方案1】:

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

假设有一个known.sh 脚本

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

unknown.sh 脚本

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

最后,一个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】:

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

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

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

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

    猜你喜欢
    • 2013-08-18
    • 2016-08-04
    • 1970-01-01
    • 1970-01-01
    • 2014-11-23
    • 2016-04-08
    • 2010-12-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多