현재 모니터링 도구의 출력을 파일로 리디렉션하고 있지만, 내가 원하는 것은 해당 도구를 중지하지 않고 내 요청에 따라(키 바인딩 사용) 이 출력을 새 파일로 리디렉션하는 것입니다.
그것은 마치
monitor_program | handle_stdout
Where를 handle_stdout
사용하면 특정 지점에 로그를 배치하는 새 파일을 정의할 수 있습니다.
쉽게 작성할 수 있다는 것을 알고 있지만 이미 이를 허용하는 도구가 있는지 궁금합니다.
답변1
나는 명명된 파이프를 제안하고 싶습니다.
파이프를 만듭니다
mkfifo p
("p"가 아닌 경우 원하는 대로 이름을 지정할 수 있습니다).파이프에서 읽고 원하는 곳에 쓰는 "리더" 스크립트를 만듭니다.
명명된 파이프에 로그를 쓰도록 모니터링 프로그램에 지시합니다.
다음은 명명된 파이프 "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 > p
reader.sh
CtrlCCtrlZ