두 개의 자식 프로세스를 생성하고 싶지만 두 번째 자식 프로세스를 생성하기 전에 첫 번째 실행 프로세스 (stdout을 검사하여 결정할 수 있음)의 특정 지점에 도달 할 때까지 기다립니다. 나는 이것을 달성하는 데 어떤 유닉스 명령이 포함 될지 확신하지 못하고 유닉스 명령 이름의 간결하고 때로는 비밀스런 성격으로 인해 Google을 통해 무엇이든 찾는 데 어려움을 겪었습니다.
나는 해결하려는 특정 문제에 대한 해결책을 찾고 있지 않습니다 (추가 포인터가 감사 할지라도), 나는 주로 어떤 유닉스 명령을 찾고 사용하고 싶어하는지 알고 싶습니다.
답변
xargs
이 유틸리티를 사용할 수 있습니다 . stdin에서 각 줄에 대해 명령을 실행할 수 있으므로 명령을 xargs
시작할 때 stdin에서 단일 줄을 입력으로 가져와야합니다 grep
.
proc1 | grep --max-count=1 "${targetString}" | xargs --max-lines=1 --no-run-if-empty --replace -- proc2
인수는 --max-count=1
, --max-lines=1
그리고 --no-run-if-empty
그 확인 proc2
을 시작 정확히 경우 언제 한 번 proc1
출력 ${targetString}
처음으로, 결코 경우 proc1
결코 출력 ${targetString}
. 이를 --replace
피 xargs
하면 입력 행이 해당 명령 행에 추가됩니다.
다음 명령 줄을 사용하여 테스트했습니다.
(echo Start >&2; sleep 3 ; echo Trigger; sleep 3; echo End >&2) | grep --max-count=1 Trigger | xargs --max-lines=1 --no-run-if-empty --replace -- echo "Triggered"
답변
나는 당신이 묻는 질문에 대한 우아한 명령 / 답변이 있는지 확실하지 않습니다 (즉, 실행 중 특정 지점에 도달). 그러나 솔루션을 개발하는 데 사용할 수있는 도구 / 기술이 있습니다. 다음, 그리고 내가 아직 모르는 다른 것들 :
- 백그라운드 프로세스 (&)
- 조건부 실행 (&& 및 ||)
- 자다
- 대기 (이것이 특히 유용 할 것으로 기대합니다-백그라운드에서 둘 이상의 작업을 시작하면 모든 작업이 완료 될 때까지 기다립니다)
- 명명 된 파이프 (프로세스 간 대화 메커니즘을 제공 할 수 있음)
- inodenotifywait
잠금 파일을 작성하고 확인하는 것도 일반적인 관행입니다 (프로 팁-환경을 제어 할 경우 / tmp가 아닌 램 디스크에 쓰기-많은 배포판에서 / dev / shm입니다).
답변
이것은 단지 아이디어 일 뿐이지 만 첫 번째 프로세스가 grep으로 출력을 파이프하도록합니다. grep 파이프의 출력을 읽기 라인 루프로 파이프하고 각 라인을 원하는 내용과 비교하십시오. 발견되면 proc2를 실행하십시오.
#!/bin/bash
targetString="line you are looking for"
proc1 | grep "${targetString}" |
while read line
do
if [ "$line" = "${targetString}" ]; then
proc2
fi
done
“실행의 특정 지점”을로 결정할 수 있다면 stdout
다음은 어떻습니까?
proc1 | grep "stdout trigger string" && proc2
&&
때 발생한다 grep
반환 0
이 일치하는 항목을 발견 한 경우에만 수행한다.