프로세스가 실행되는 동안 파이프를 편집하는 방법이 있습니까?

프로세스가 실행되는 동안 파이프를 편집하는 방법이 있습니까?

나는 때때로 다음과 같은 프로세스를 사용합니다.

  • 느린 시작
  • 잠시 달리다
  • 대량의 정보를 표준 출력에 기록

예를 들어 이것이 대규모 웹 애플리케이션이라고 가정합니다.

이제 당분간은 포함 내용을 보고 싶다고 가정하겠습니다 foo. 결국 다음과 같은 작업을 수행하게 됩니다.

$ heavy_process
# watch for a bit
# ah, now I just want to see lines that contain 'foo'
# (kill heavy_process)

$ heavy_process | grep foo
# watch for a bit
# ok, I'm statisfied about foo. Let's look at bar instead
# (kill heavy_process)

$ heavy_process | grep bar

heavy_process정말 바꾸고 싶을 때 | grep.

명령줄에서 파이프라인 내에서 "파이프를 추가 및 제거"하는 방법이 있습니까?

답변1

내 생각엔 좀제어 프로세스피하기 어려운. 나는 다양한 방법을 생각할 수 있다. grep대신 코어를 따라 동적 패턴 일치자가 동적으로 로드 awk '$0 ~ pat'됩니다 pat(예: GNU awkcoprocess를 통해). 또는 기본 패턴 주입 솔루션모드 변경awk아래와 같이 필터가 패턴을 동적으로 쉽게 조정할 수 있도록 지시문이 데이터 스트림에 삽입됩니다 .

mkfifo cmdfifo       # create once an asynchroneous communication channel

{ while read cmd < cmdfifo ; do printf "%s\n" "@$cmd" ; done &
  heavy_process ;} |
    awk '
        /^@/ { pat = substr($0,2) ; next }   # parse the injected pattern
        pat !="" && $0 ~ pat     # if pattern is set print matching lines
    '

검색 특정 모드를 활성화하거나 전환하려면 다음을 사용할 수 있습니다.

echo bar > cmdfifo

"bar" 매칭을 활성화한 후

echo foo > cmdfifo

모드를 "foo"로 동적으로 변경합니다.

답변2

나는 귀하의 제안이 백그라운드에서 명령을 실행할 때 수정된 최상의 솔루션이라고 생각합니다.

heavy_process > some_file &

stderr에서 검색할 수 있도록 하려는 텍스트를 작성하려면 2>&1if를 추가하세요 . heavy_process프로그램이 "많은 정보를 표준 출력에 기록한다"고 말했으므로 프로세스가 비동기적으로 실행되도록 2>&1명령 끝에 . &달리기. 사용하는 셸에 따라 종료 시 알림을 받을 수도 있습니다.

검색 프로세스의 출력지금까지, 당신에게 필요한 것은

grep foo some_file

지금까지의 검색 결과 프로세스가 파일에 쓰는 동안 계속해서 파일을 모니터링합니다., 사용

tail -n +1 -f some_file | grep foo

그렇지 않은 경우 -n +1파일 tail의 마지막 10줄만 제공됩니다.

답변3

다음과 같은 스크립트를 작성할 수 있습니다.

#! /bin/bash
while true;
do
        echo -n "Enter your regexp: "
        read myregexp
        heavy_process | grep "$myregexp"
done

Ctrl-c를 사용하여 언제든지 프로세스를 중단할 수 있습니다.

관련 정보