我必须同时在一个终端(服务器)中运行脚本并在第二个终端(用户)中运行 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。第二个flock
也尝试获取独占锁,但由于锁已被持有而被阻止。一旦第一个flock
释放锁,第二个就运行/bin/true
,它立即返回,因此命令继续。
是的,这意味着它将command_a
在 之前的一小部分开始command_b
。但在 shell 脚本中,这种延迟无论如何都是不可避免的,所以这应该不重要。
根据您的 Linux 风格,您可能没有/bin/read
.你可以通过这样做来完成同样的事情flock ... bash -c "read -p 'press enter to begin'"
答案2
您可以使用命名管道。一个open()
在读命名管道上的模式会阻塞,直到另一个模式open()
被创建写模式(反之亦然)。
首先创建管道:
mkfifo mypipe
然后:
第一个航站楼:
cmd1 3> mypipe 3>&-
第二航站楼:
cmd2 3< mypipe 3<&-
open()
第一个 shell 在mypipe
执行之前完成的操作cmd1
将在第二个 shell 打开时立即解除阻塞mypipe
。请注意,这两个流程将在不同的时间开始,但两者命令将同时执行,因为这就是打开管道后这两个进程将执行的操作。
如果您想同时启动流程同时,你可以这样做:
:>mypipe; cmd1
:<mypipe; cmd2
尽管这会稍微降低两者的可能性命令同时执行(因为两个 shell 可能需要不同的时间来启动进程)。