두 개의 터미널에서 동시에 실행되는 두 개의 명령 [닫기]

두 개의 터미널에서 동시에 실행되는 두 개의 명령 [닫기]

한 터미널(서버)에서 스크립트를 실행하고 두 번째 터미널(사용자)에서 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. 그러나 쉘 스크립트에서는 어쨌든 이러한 지연이 불가피하므로 문제가 되지 않습니다.

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두 번째 셸이 열리자마자 차단이 해제됩니다 mypipe. 이 두 가지를 참고해주세요프로세스서로 다른 시간에 시작되지만 둘 다주문하다파이프가 열리면 두 프로세스가 모두 수행하기 때문에 동시에 실행됩니다.

둘 다 시작하고 싶다면프로세스그동안 다음을 수행할 수 있습니다.

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

이렇게 하면 둘 다의 가능성이 약간 줄어들지만주문하다동시에 실행합니다(두 셸이 프로세스를 시작하는 데 서로 다른 시간이 걸릴 수 있으므로).

관련 정보