inetd으로 로그를 뿌려주는 프로그램을 만들고 싶습니다.
글쓴이: purewell / 작성시간: 목, 2006/05/25 - 10:50오후
OS: SunOS 5.8
/etc/inetd.conf 마지막에 아래와 같은 줄을 추가하였습니다.
viewlog stream tcp nowait purewell /export/home/purewell/bin/in.viewlog in.viewlog
in.viewlog는 다음과 같은 스크립트입니다.
#!/bin/sh tail -10000f /var/log/myserver.log | awk '{print $1}' | /export/home/purewell/bin/viewlogd
viewlogd.c는 다음과 같은 C소스를 컴파일한 것입니다.
#include <stdio.h> int main(int argc, char* argv[]) { char buf[102400]; const int bufsize = sizeof(buf); int rsize; while (!feof(stdin) && !feof(stdout) && !feof(stderr)) { fputc(fgetc(stdin), stdout); fflush(stdout); } return 0; }
$ gcc -O3 -o -static viewlogd viewlogd.c
로그 파일은 3-40메가입니다.
$ ./in.viewlog 또는 telnet localhost 9989
위와 같이 입력하면 로그파일을 주르르르르르~ 뿌려줍니다. 문제는 tail -f인데도 불구하고 로그를 계속 뿌려주지 않습니다.
트래이스 해보면 fgets에서 멈춰있습니다.
in.viewlog 안에 명령 줄 가운데 맨 끝에 '| /.../viewlogd' 이 부분을 제거하면 제대로 출력은 되는데 텔넷으로 연결했을 경우 tail과 awk 프로세스가 죽지 않습니다.
왜 fgets에서 멈춰 있는 것일까요?
Forums:
댓글 달기