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/read
。flock ... bash -c "read -p 'press enter to begin'"
答え2
名前付きパイプを使用できます。一つopen()
読む名前付きパイプのパターンは、他のパターンがopen()
生成されるまでブロックされます。書くモード(またはその逆)。
まず、パイプラインを作成します。
mkfifo mypipe
それから:
最初の端末:
cmd1 3> mypipe 3>&-
ターミナル2:
cmd2 3< mypipe 3<&-
open()
最初のシェルが実行されるmypipe
前に完了した操作は、cmd1
2番目のシェルが開くとすぐにブロック解除されますmypipe
。これら2つを参考にしてくださいプロセス異なる時間に始まりますが、どちらも注文するパイプが開くと、両方のプロセスが実行されるため、同時に実行されます。
両方を始めたい場合プロセスその間、次のことができます。
:>mypipe; cmd1
:<mypipe; cmd2
これにより、両方の可能性がわずかに減少しますが、注文する同時に実行します(両方のシェルがプロセスを開始するのに異なる時間がかかる可能性があるため)。