한 터미널(서버)에서 스크립트를 실행하고 두 번째 터미널(사용자)에서 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
이렇게 하면 둘 다의 가능성이 약간 줄어들지만주문하다동시에 실행합니다(두 셸이 프로세스를 시작하는 데 서로 다른 시간이 걸릴 수 있으므로).