6410


以下の３つの処理を同時にスタートさせたいのですが、どうすればよいでしょうか。  
個々のコマンドは以下の通りです。

１：ファイル名を指定して、en0(wi-fiのポート)を対象に30秒（-G30)キャプチャを１回（-  
w1）実施。

[code]

    tcpdump -Ini en0 -w test1.pcap -W1 -G30 &
    
[/code]

２：ファイル名を指定して、同時にeth0(Etherのポート)を対象に30秒（-G30)キャプチャを１回（-w1）実施。

[code]

    tcpdump -Ini eth0 -w test1.pcap -W1 -G30 &
    
[/code]

３：スループット測定実施（30秒）

[code]

    iperf -c 192.168.1.2 -i 1 -t 30 -f m >> DL1.txt
    
[/code]


CC BY-SA 3.0
2015-02-12T11:03:08.147
6384
2015-02-13T12:11:35.273
7590
question
macos bash
tcpdump2つと、iperfを同時に実施したい


heliac2001氏おっしゃった通り、&で繋いでいくだけも同時に実施出来る。

[code]

    python -c'import time; print repr(time.time())' & python -c'import time; print repr(time.time())' & python -c'import time; print repr(time.time())' &
    
[/code]

でも同時に、[ビジーウェイト](http://ja.wikipedia.org/wiki/%E3%83%93%E3%82%B8%E3%83%BC%E3%82%A6%E3%82%A7%E3%82%A4%E3%83%88)という方法もあります。

[code]

    startTime=$(($(date +%s)+2));
    (while [ $(date +%s) -lt $startTime ]; do continue; done; python -c'import time; print repr(time.time())' )&
    (while [ $(date +%s) -lt $startTime ]; do continue; done; python -c'import time; print repr(time.time())' )&
    (while [ $(date +%s) -lt $startTime ]; do continue; done; python -c'import time; print repr(time.time())' )&
    
[/code]

ちょっと統計もして参りました。

＆で繋がるの場合：  
実行時間差（平均） ：0.000140023秒  
実行時間差（標準偏差）：0.000159186秒

ビジーウェイトの場合：  
実行時間差（平均） ：0.000125468秒  
実行時間差（標準偏差）：0.000125655秒

  
  
つまり。。。ビジーウェイトの方が＆で繋がるの方より。。。  
ちょ〜っと信頼出来るかもしれないね〜（笑）  


CC BY-SA 3.0
2015-02-12T21:29:13.577
6410
2015-02-12T22:22:10.660
2015-02-12T22:22:10.660
8229
8229
6384
answer


以下は回答ではないのですが、kaho 氏の実行時間差の話が興味深いので便乗することにしました。

`xargs` コマンドには `-P(--max-procs)`
オプションがあります。マルチコアな環境であれば、このオプションで同時開始の精度も高くなるのではないかと思い試してみました。  
まず、テストを行うシステムのコア数は 6 個です。Hyper threading を有効にしている場合なら 12
個になりますが、ここでは物理コア数で行います。

[code]

    $ lsb_release -a
    Description: CentOS release 6.6 (Final)
    $ grep "cpu cores" /proc/cpuinfo
    cpu cores: 6
    
[/code]

以下の bash スクリプトを実行します。

[code]

    for ((j=0;j<100;j++));
    do
      for ((i=0;i<6;i++));
      do
        echo "date +'%s.%N'"
      done | 
      xargs -P 6 -n 1 -I{} bash -c {} | 
      sort -nr | 
      sed -n '1h;${H;x;s/\n/-/;p}' |
      bc -l
    done |
    datamash --header-out min 1 max 1 mean 1 sstdev 1 
    
[/code]

`date` コマンドの `%N` は `nano second` 単位の時刻です。`date` コマンドをコア数と同じだけ実行します(`bash -c`
経由ですが)。  
それぞれの `date` コマンドの出力(時刻)の最大値と最小値の差を計算しています。つまり、最初に実行された `date` コマンドと最後に実行された
`date` コマンドの時間差(latency)を求めています。  
そして、`xargs` コマンドを 100 回実行した結果の平均値などを表示します(単位は second)。

[code]

    xargs -P 6
    ==========
    min(field-1) max(field-1) mean(field-1) sstdev(field-1)
    0.000452984  0.00209947   0.00073452719 0.00037394411115865
    
[/code]

それでは `xargs -P 1` の場合はどうなるのでしょうか。

[code]

    xargs -P 1
    ==========
    min(field-1) max(field-1) mean(field-1) sstdev(field-1)
    0.015791057  0.016713646  0.01611698115 0.00028451781566438
    
[/code]

平均値で言えば、`-P 6` では 0.7 ms、`-P 1` では 16 ms となっていて、意外と違いがあるものですね。同じ様にして、`date`
コマンドを `&` で繋いだ場合の結果は以下です。

[code]

    .. & .. &
    ==========
    min(field-1) max(field-1) mean(field-1) sstdev(field-1)
    0.011146015  0.012019075  0.01146450092 0.00010309165719037
    
[/code]

ただ、`xargs -P` で並列実行する場合は偏差が(相対的に)大きく、その点が気になりますね(理由は色々と思い付きますけれども)。


CC BY-SA 3.0
2015-02-13T12:11:35.273
6449
2015-02-13T12:11:35.273
6384
answer