두 개의 자식 프로세스를 연속적으로 만드는 데 어떤 명령을 사용해야합니까?


8

두 개의 자식 프로세스를 생성하고 싶지만 두 번째 자식 프로세스를 생성하기 전에 첫 번째 실행 프로세스 (stdout을 검사하여 결정할 수 있음)의 특정 지점에 도달 할 때까지 기다립니다. 나는 이것을 달성하는 데 어떤 유닉스 명령이 포함 될지 확신하지 못하고 유닉스 명령 이름의 간결하고 때로는 비밀스런 성격으로 인해 Google을 통해 무엇이든 찾는 데 어려움을 겪었습니다.

나는 해결하려는 특정 문제에 대한 해결책을 찾고 있지 않습니다 (추가 포인터가 감사 할지라도), 나는 주로 어떤 유닉스 명령을 찾고 사용하고 싶어하는지 알고 싶습니다.


파이썬을 사용할 수 있습니까?
xrisk

3
"실행의 확실한 포인트"를 어떻게 결정하는지 모르면 이것은 매우 모호합니다.
muru

@muru가 명확히하기 위해 편집 함
w.brian

따라서 실제로 3 개의 프로세스가 필요합니다. 1. 실행, 출력 생성; 2. 1의 출력을 모니터링하고 특정 지점에서 3을 시작합니다. 이것은 당신이 만들고있는 것을 만들기 시작하기에 충분한 정보입니다. 그러나 프로그램을 설계하는 좋은 방법은 아닙니다.
djsmiley2kStaysInside

답변:


7

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}. 이를 --replacexargs하면 입력 행이 해당 명령 행에 추가됩니다.

다음 명령 줄을 사용하여 테스트했습니다.

(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"

1
+1 이것은 매우 창의적인 답변입니다. proc1의 나머지 출력이 필요한 경우 훨씬 더 복잡해집니다. 티 및 추가 파일 설명자 또는 명명 된 파이프와 같은 것을 사용해야합니다.
Joe

7

나는 당신이 묻는 질문에 대한 우아한 명령 / 답변이 있는지 확실하지 않습니다 (즉, 실행 중 특정 지점에 도달). 그러나 솔루션을 개발하는 데 사용할 수있는 도구 / 기술이 있습니다. 다음, 그리고 내가 아직 모르는 다른 것들 :

  1. 백그라운드 프로세스 (&)
  2. 조건부 실행 (&& 및 ||)
  3. 자다
  4. 대기 (이것이 특히 유용 할 것으로 기대합니다-백그라운드에서 둘 이상의 작업을 시작하면 모든 작업이 완료 될 때까지 기다립니다)
  5. 명명 된 파이프 (프로세스 간 대화 메커니즘을 제공 할 수 있음)
  6. inodenotifywait

잠금 파일을 작성하고 확인하는 것도 일반적인 관행입니다 (프로 팁-환경을 제어 할 경우 / tmp가 아닌 램 디스크에 쓰기-많은 배포판에서 / dev / shm입니다).


6

이것은 단지 아이디어 일 뿐이지 만 첫 번째 프로세스가 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이 일치하는 항목을 발견 한 경우에만 수행한다.


1
grep은 stdin이 닫힐 때까지 계속 진행됩니다. 그때까지는 0을 반환하지 않습니다.
Bob

@ 밥 오, 감사합니다 ... 나는이 아이디어를 바꾸려고 노력할 것입니다.
Louis Waweru

@bob 특히 혼란스럽고 연결이 끊어졌고 도구를 잘못 사용했지만 fail2ban을 사용하여 로그 파일 (예 : 파이프 stdout을 파일로)을 모니터링 한 다음 해당 줄이있을 때 두 번째 스크립트를 실행하도록 규칙을 프로그래밍 할 수 있습니다. 실측치 (하지만 더 우아한 해결책 트리거 파일을 수정하고 inotify를 사용 정찰)
davidgo

1
proc1 출력에서 ​​targetstring이 두 번 이상 발생하면 proc2가 여러 번 실행됩니다. 당신이 한 경우 proc2 &다음과 break, 그런 일이 않을 것이다, 그러나 그것은 파이프와 메이크업 PROC1이 조기에 종료 닫 것이다. 또는 proc2가 시작되면 플래그를 설정하고이를 사용하여 proc2가 다시 실행되지 않도록 할 수 있습니다. 다른 답변과 마찬가지로 나머지 proc1 출력은 삭제되므로 필요한 경우 더 많은 작업이 필요합니다.
Joe

1
@ 조 좋은 지적. 이 정말 이러한 명령 '가능성의 일부를 보여 단지에 대한 답변 (주로 있도록 원래의 질문은 사실 그냥 명령과 함께 작업에 사용할 수 있었던 것에 대해 질문했다 |그리고 grep여기).
Louis Waweru
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.