Dois comandos para rodar simultaneamente em dois terminais [fechados]

1

Eu tenho que executar o script em um terminal (servidor) e arquivo jar no segundo terminal (usuário) ao mesmo tempo e millisec importa. É possível. Obrigado

    
por Joseph 29.08.2016 / 06:51

2 respostas

5

Você pode usar bloqueios de arquivo para realizar isso com bastante facilidade.

Crie 2 scripts com o seguinte conteúdo. Execute o terminal Um script primeiro, depois B.

Terminal A:

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

Terminal B:

flock -x /tmp/lockfile true
command_b

Pressione Enter no terminal A quando estiver pronto para começar.

A maneira como funciona é que o primeiro flock captura um bloqueio exclusivo em /tmp/lockfile e mantém esse bloqueio até você pressionar Enter . O segundo flock também tenta pegar um bloqueio exclusivo, mas está bloqueado porque o bloqueio já está retido. Assim que o primeiro flock libera o bloqueio, o segundo executa /bin/true , que imediatamente retorna, e assim os comandos continuam.

Sim, isso significa que command_a começará uma pequena fração de segundo antes de command_b . Mas no script de shell, esses atrasos serão inevitáveis de qualquer forma, então não importa.

Dependendo do seu sabor do linux, talvez você não tenha /bin/read . Você pode realizar o mesmo fazendo flock ... bash -c "read -p 'press enter to begin'"

    
por 29.08.2016 / 07:30
0

Você pode usar um pipe nomeado. Um modo open() in read em um pipe nomeado bloqueia até que outro open() seja feito no modo write (e vice-versa).

Crie o pipe primeiro com:

mkfifo mypipe

Então:

  • Primeiro terminal:

    cmd1 3> mypipe 3>&-
    
  • Segundo terminal:

    cmd2 3< mypipe 3<&-
    

O open() feito pelo primeiro shell em mypipe antes de executar cmd1 será desbloqueado assim que o segundo shell abrir mypipe . Note que os dois processos serão iniciados em momentos diferentes, mas os dois comandos serão executados ao mesmo tempo que esses dois processos farão após abrir o pipe .

Se você quisesse iniciar os dois processos ao mesmo tempo, você poderia fazer:

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

Embora isso torne um pouco menos provável que ambos os comandos sejam executados ao mesmo tempo (já que ambos os shells podem levar diferentes quantidades de tempo para iniciar os processos).

    
por 29.08.2016 / 09:15