요청에 따라 출력을 새 파일로 동적으로 리디렉션할 수 있는 도구가 있습니까?

요청에 따라 출력을 새 파일로 동적으로 리디렉션할 수 있는 도구가 있습니까?

현재 모니터링 도구의 출력을 파일로 리디렉션하고 있지만, 내가 원하는 것은 해당 도구를 중지하지 않고 내 요청에 따라(키 바인딩 사용) 이 출력을 새 파일로 리디렉션하는 것입니다.

그것은 마치

monitor_program | handle_stdout

Where를 handle_stdout사용하면 특정 지점에 로그를 배치하는 새 파일을 정의할 수 있습니다.

쉽게 작성할 수 있다는 것을 알고 있지만 이미 이를 허용하는 도구가 있는지 궁금합니다.

답변1

나는 명명된 파이프를 제안하고 싶습니다.

  1. 파이프를 만듭니다 mkfifo p("p"가 ​​아닌 경우 원하는 대로 이름을 지정할 수 있습니다).

  2. 파이프에서 읽고 원하는 곳에 쓰는 "리더" 스크립트를 만듭니다.

  3. 명명된 파이프에 로그를 쓰도록 모니터링 프로그램에 지시합니다.

다음은 명명된 파이프 "p"에서 데이터를 읽고 해당 데이터를 인덱스 "mylog" 파일에 쓰는 샘플 판독기 스크립트입니다.

#!/bin/sh

INDEX=0

switchlog() {
  read INDEX < newindex
  echo now writing to "mylog.$INDEX"
}

trap switchlog USR1

while :
do
  cat p >> mylog."$INDEX"
done

답변2

SIGQUIT()를 사용하는 SIGINT 아이디어를 기반으로 여전히 모든 것을 중지하는 Ctrl+\데 사용할 수 있습니다 .Ctrl+C

(trap '' QUIT; monitor_command) | (
   trap : QUIT
   ulimit -c 0 # prevent core dump so SIGQUIT behaves like SIGINT
               # for cat
   n=0; while n=$((n+1)); file=output.$n.log; do
     printf 'Outputting to "%s"\n' "$file"
     cat > "$file"
   done)

이는 쉘에 내장된 명령이 아니라고 가정합니다 cat(그래서 사용자에 의해 중단됩니다 Ctrl+\).

귀하의 메소드와 마찬가지로 SIGQUIT도 잘못된 시간(쓰기 시스템 호출에서)에 전달되어 일부 데이터가 손실될 수 있습니다.

답변3

저장하려는 파일 이름을 less입력한 다음 .from 을 입력 하면 됩니다.sEnterless의 모든 줄을 파일에 쓰는 방법은 무엇입니까?.

답변4

감사해요제프 샬러의 답변, 나는 기본적으로 내가 필요한 것을 수행하는 다음과 같은 것으로 끝났습니다 reader.sh.

#!/bin/sh

INDEX=0
LOGNAME="$INDEX.log"

switchlog() {
  local custom_name
  read -p "Add log name: " custom_name
  INDEX=$((INDEX+1))
  LOGNAME="$(printf "%03d" $INDEX).$custom_name.log"
  echo now writing to $LOGNAME
}

trap switchlog INT
switchlog

while :
do
  read foo < p
  printf "%s\n" "$foo" >> "$LOGNAME"
done

그런 다음 을 사용하여 명명된 파이프를 만들고 및 를 mkfifo p실행하는 두 개의 터미널을 사용합니다. 그런 다음 독자가 +를 사용하여 새 게시물을 설정하는 것을 방지하고 새 이름을 입력할 수 있습니다. + 그런 다음 평소처럼 중지하고 종료하십시오.monitor_program > preader.shCtrlCCtrlZ

관련 정보