在两个终端中同时运行的两个命令

在两个终端中同时运行的两个命令

我必须同时在一个终端(服务器)中运行脚本并在第二个终端(用户)中运行 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 可能需要不同的时间来启动进程)。

相关内容