2017-10-29 16 views
1

스크립트는 들어오는 HTTP 메시지를 모니터링하여 zabbix라는 모니터링 응용 프로그램으로 전달합니다. 그러나 정상적으로 작동하지만 약 1-2 일 후에는 작동을 멈 춥니 다. Heres는 내가 지금까지 알고있는 것을 :bash 스크립트가 작동을 멈추는 이유

  • 내가
를 작동하는 스크립트가 여전히 (스크립트의 첫 번째 명령)
  • 는 FIFO 파이프 보인다 제대로 로그 파일이 업데이트됩니다
  • 실행 참조 pgrep 사용

    문제는 WHILE loop 또는 tail 명령의 어딘가에 있어야합니다. 스크립팅시 새로운 것이므로 누군가 즉시 문제를 발견 할 수 있습니까?

    #!/bin/bash 
    tcpflow -p -c -i enp2s0 port 80 | grep --line-buffered -oE 'boo.php.* HTTP/1.[01]' >> /usr/local/bin/logfile & 
    
    pipe=/tmp/fifopipe 
    
    trap "rm -f $pipe" EXIT 
    
    if [[ ! -p $pipe ]]; then 
         mkfifo $pipe 
    fi 
    
    tail -n0 -F /usr/local/bin/logfile > /tmp/fifopipe & 
    
    while true 
    do 
        if read line <$pipe; then 
    
         unset sn 
    
         for ((c=1; c<=3; c++)) # c is no of max parameters x 2 + 1 
         do 
           URL="$(echo $line | awk -F'[ =&?]' '{print $'$c'}')" 
    
           if [[ "$URL" == 'sn' ]]; then 
           ((c++)) 
           sn="$(echo $line | awk -F'[ =&?]' '{print $'$c'}')" 
           fi 
    
         done 
    
         if [[ "$sn" ]]; then 
             hosttype="US2G_" 
             host=$hosttype$sn 
             zabbix_sender -z nuc -s $host -k serial -o $sn -vv 
         fi 
        fi 
    done 
    
  • +0

    여기서 변수 $ host에 값을 할당합니까? – Cyrus

    +0

    이것은 도움이 될 수 있습니다 : [bash 스크립트를 디버깅하는 방법?] (http://unix.stackexchange.com/q/155551/74329) – Cyrus

    +0

    나는 여기에 게시하기 위해 스크립트를 약간 단순화했습니다. 게시물을 수정했습니다. – tarmogr

    답변

    3

    fifo에서 잘못 입력하고 있습니다. 작성 :

    while true; do read line < $pipe ....; done 
    

    루프를 반복 할 때마다 fifo를 닫았다가 다시 엽니 다. 처음으로 파이프를 닫을 때 파이프 생산자 (tail -f)는 SIGPIPE를 얻고 죽습니다. 당신은 아마 각 명시 적으로 가까운 표준 입력에 할 것입니다, 그래서 루프 내부의 모든 프로세스가 이제 실수로 파이프에서 읽을 수있는 잠재력을 가지고

    while true; do read line; ...; done < $pipe 
    

    참고로 구조를 변경합니다.

    +0

    당신이 설명한 것처럼 루프를 재 배열했습니다. 며칠 후 문제가 해결되었는지 알 수 있습니다. 그러나 각 프로세스에 대해 stdin을 어떻게 닫을 수 있습니까? – tarmogr

    +0

    또한 stdin (일명 fd # 0) 대신 fd # 3을 통해 파이프를 읽음으로써 파이프에서 다른 프로세스를 읽는 문제를 피할 수 있습니다. <& 3 라인을 읽으십시오. ...; done 3 <$ pipe' –

    +0

    @tarmogr ​​닫으려면, 당신은'<& -'할 수 있습니다. 예. 'zabbix_sender <& - args' –