command1 | command2 > out.txt
형식의 명령어 구문에서의 문제인데요,
command2에서 command1의 출력을 계속 bufferring하고 있다가,
한꺼번에 출력하기 때문에 생기는 문제입니다.
한꺼번에 출력(flush)하는 시점은 버퍼가 꽉차거나, command1이 정상종료하거나 인데,
현재는 두가지 조건 중 어느것도 만족이 안되기 때문입니다.
ping -c1 을 주면 정상종료 조건이 만족되므로 이 시점에서 fflusing이 일어납니다.
해결방법은
1. 일단 정상종료하도록 짧은 코맨드를 루프를 돌면서 날리는것이 제일 좋은 방법이고
2. command2에 해당하는 명령어들이 모두 line-buffer를 사용하도록 옵션을 주는 방법입니다.
일부 명령어에 대해서 이 옵션은 위 사이트에 잘 나와있습니다.
예를 들어 아래와 같은 방법이 되겠지요..
ping 192.168.0.1 | grep --line-buffered From | sed -u 's,From,To,' | awk '{print $1; fflush()}' > log.txt
awk가 line-by-line으로
awk가 line-by-line으로 처리되는데,
redirection과 겹쳐서 fflushing이 잘 안되는것 같네요..
awk가 문제인지,redirection이 문제인지는 잘 모르겠네요.
둘이 따로따로는 잘 동작하는데요..
ping -c1 192.168.0.1 | awk '{print $1}' >> log.txt
로 하시고, 실시간으로 반복동작이 필요하면,
앞뒤로 loop와 sleep을 추가하시면 되겠습니다.
어이쿠 죄송합니다.
글을 너무올려서 도배를 하는것같아서 기존글을 바꿔치기했거든요
이부분 죄송합니다.
그래도 핵심 내용은 실시간 메세지 임의 필드 추출과 같은 상황이기때문에.. 도움이 엄청되었습니다.
아직 awk 지식이 얇다보니 이해가 좀 힘들지만 한번 검색해서 해봐야겠네요
저도 궁금해서 찾아봤습니다. 일단 아래 사이트에
저도 궁금해서 찾아봤습니다. 일단 아래 사이트에 해결방법이 있습니다.
http://mywiki.wooledge.org/BashFAQ/009
command1 | command2 > out.txt
형식의 명령어 구문에서의 문제인데요,
command2에서 command1의 출력을 계속 bufferring하고 있다가,
한꺼번에 출력하기 때문에 생기는 문제입니다.
한꺼번에 출력(flush)하는 시점은 버퍼가 꽉차거나, command1이 정상종료하거나 인데,
현재는 두가지 조건 중 어느것도 만족이 안되기 때문입니다.
ping -c1 을 주면 정상종료 조건이 만족되므로 이 시점에서 fflusing이 일어납니다.
해결방법은
1. 일단 정상종료하도록 짧은 코맨드를 루프를 돌면서 날리는것이 제일 좋은 방법이고
2. command2에 해당하는 명령어들이 모두 line-buffer를 사용하도록 옵션을 주는 방법입니다.
일부 명령어에 대해서 이 옵션은 위 사이트에 잘 나와있습니다.
예를 들어 아래와 같은 방법이 되겠지요..
ping 192.168.0.1 | grep --line-buffered From | sed -u 's,From,To,' | awk '{print $1; fflush()}' > log.txt
아아... 깊은 깨달음이..
아.. 명령어에 따라 콘솔에 메세지가 지속적으로 뜨는반면
어떤건 커서만 깜박거리다가 완료나 종료돼었을때 한번에 콘솔에 출력돼는경우를
봤는데요..이것이 바로 fflush() 가 안되고 버퍼링에 계속 담겨있어서 그랬군요..
Buffered I/O 방식도
Fully buffered IO : 버퍼가 가득차거나 fflush()가 호출되거나.
Line Buffered IO : 버퍼가 가득차거나 개행문자를 만났을때
UnBuffered IO : 한글자씩 출력
인터넷을 검색해보니 대분류에서 저렇게 설명이되있더라구요..
콘솔의 메세지가 어떤방식으로 출력돼는지 조금씩 이해가갑니다.
ls -l |
까지 할경우 검색된 자료가 메모리에 저장이 되서
grep root |
grep 유틸리티로 root 문자를 변수에서 검색하고
뭐 이런결과값들을 수동으로 플래쉬를 써서 출력시키든지 버퍼를 채워서 일어나게하든지..
뭐그렇게 하나보군요..
솔직히 지금 ffmepg 실시간기록 제가원하는방식으로 확실하게 해결할수있을지 장담은 못하겠는데..
그래도 희망이 생긴것같아 너무감사드립니다.
PHP에서 실행 결과를 처리하려면 차라리 파일을
PHP에서 실행 결과를 처리하려면 차라리 파일을 열기보다는 PHP의 popen 함수를 사용하시는 게 더 낫습니다.
http://php.net/manual/en/function.popen.php
오호.. 정말감사합니다.
빠른속도로 텍스트파일을 계속 읽어줘야하는데 저걸로 쓰면 유용하겠군요..감사합니다.
qiiiiiiiip 분께서 도와주신걸로 간단하게 해보니..
댓글 달기