로그 파일의 메시지를 데스크탑에 실시간으로 표시

로그 파일의 메시지를 데스크탑에 실시간으로 표시

내 데스크탑에 로그 파일의 메시지를 실시간으로 표시하고 싶습니다. (페도라 24의 xfce4)

내 생각은 쉘 스크립트에서 알림 전송 및 tail -f를 사용하여 이를 수행하는 것입니다.

지금까지 두 개의 쉘 스크립트가 있습니다.

  1. read_data.sh
  2. write_data.sh

둘 다 프로세스를 분기하고 파이프를 통해 통신합니다.

write_data.sh:

tail -f /var/log/logfile > mypipe

read_data.sh:

mkfifo mypipe

while true
do
    echo "read now from pipe"
    if read line <mypipe; then
        echo $line
    fi
done

불행하게도 다음과 같은 오류 메시지가 나타납니다.

EPIPE (Broken pipe)

나는 무슨 일이 일어났는지 분석하기 위해 strace를 사용했습니다.

write_data.sh:

strace tail -f /var/log/logfile > mypipe
....
write(1, "Message from logfile"..., 281) = -1 EPIPE (Broken pipe)
--- SIGPIPE {si_signo=SIGPIPE, si_code=SI_USER, si_pid=7314, si_uid=0} ---
+++ killed by SIGPIPE +++


strace read_data.sh
...
read(0, "\n", 1)                        = 1
dup2(10, 0)                             = 0
fcntl(10, F_GETFD)                      = 0x1 (flags FD_CLOEXEC)
close(10)                               = 0
open(".", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFDIR|0550, st_size=4096, ...}) = 0
getdents(3, /* 133 entries */, 32768)   = 5400
getdents(3, /* 0 entries */, 32768)     = 0
close(3)                                = 0
write(1, "message from logfile ....
) = 62
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
write(1, "read now from pipe\n", 19read now from pipe
)    = 19
open("/tmp/mypipe", O_RDONLY

read_data.sh이때는 차단됩니다.

왜 이런 일이 발생하는지 아시나요?

답변1

SIGPIPE는 읽기 루프가 각 반복에서 읽기 위해 FIFO 파일을 열고 닫는 것에 의해 발생합니다. 이 시도:

while read line; do
    echo "$line"
done <"$pipe"

관련 정보