2017-10-29 18 views
1

スクリプトは受信HTTPメッセージを監視し、zabbixという監視アプリケーションに転送しますが、正常に動作しますが、約1〜2日後には動作を停止します。相続人は、私がこれまで知っている:私は、スクリプトがまだログファイルのファイルはFIFOパイプが を動作しているようだ、適切に(スクリプトの最初のコマンド) bashスクリプトが動作を停止する理由

  • 更新されます
  • を実行している参照pgrepを使用して

    • 問題は、WHILEループまたはテールコマンドのどこかにある必要があります。 スクリプトで新しくなったので、誰かがすぐに問題を見つけることができますか?

      #!/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

    私は説明したようにループを再編成しました。私はそれが問題を解決したかどうか私は数日後に見ることができますquess。しかし、どのように各プロセスの標準を閉じるのですか? – tarmogr

    +0

    また、stdin(別名fd#0)の代わりにfd#3でパイプを読み取ることで、他のプロセスがパイプから読み込む問題を回避することもできます。 <&3行を読んでください。 ...; done 3 <$ pipe' –

    +0

    @tarmogr閉じるには、 '<& - 'を実行します。例えば。 'zabbix_sender <& - args' –

    関連する問題