2つの端末で同時に実行される2つのコマンド[閉じる]

2つの端末で同時に実行される2つのコマンド[閉じる]

1つの端末(サーバー)でスクリプトを実行し、2番目の端末(ユーザー)でjarファイルを同時に実行する必要があるため、ミリ秒が重要です。可能ですか?ありがとう

答え1

ファイルロックを使用すると、非常に簡単にこれを行うことができます。

次の内容で2つのスクリプトを作成します。まず、端末Aスクリプトを実行してからBを実行します。

ターミナルA:

touch /tmp/lockfile
flock -x /tmp/lockfile read -p 'press enter to begin'
command_a

ターミナルB:

flock -x /tmp/lockfile true
command_b

Enter開始する準備ができたら、ターミナルAを押します。

 

どのように機能するかは、最初のロックがflock排他ロックを取得して/tmp/lockfileを押すまでそのロックを保持することですEnter。 2回flock目も排他的ロックを獲得しようとしますが、すでにロックがかかっていてブロックされます。 1 番目がflockロックを解除するとすぐに 2 番目が実行され、/bin/trueすぐに返されるので、コマンドは続行されます。

はい、これはcommand_aはるかに前に始まるという意味ですcommand_b。しかし、シェルスクリプトではとにかくこのような遅延が避けられないので問題にはなりません。

Linuxの好みに応じて/bin/readflock ... bash -c "read -p 'press enter to begin'"

答え2

名前付きパイプを使用できます。一つopen()読む名前付きパイプのパターンは、他のパターンがopen()生成されるまでブロックされます。書くモード(またはその逆)。

まず、パイプラインを作成します。

mkfifo mypipe

それから:

  • 最初の端末:

    cmd1 3> mypipe 3>&-
    
  • ターミナル2:

    cmd2 3< mypipe 3<&-
    

open()最初のシェルが実行されるmypipe前に完了した操作は、cmd12番目のシェルが開くとすぐにブロック解除されますmypipe。これら2つを参考にしてくださいプロセス異なる時間に始まりますが、どちらも注文するパイプが開くと、両方のプロセスが実行されるため、同時に実行されます。

両方を始めたい場合プロセスその間、次のことができます。

  • :>mypipe; cmd1
  • :<mypipe; cmd2

これにより、両方の可能性がわずかに減少しますが、注文する同時に実行します(両方のシェルがプロセスを開始するのに異なる時間がかかる可能性があるため)。

関連情報