0

私はこのようなbashスクリプトを持っています:

#!/bin/bash
while true; do
    sudo tcpdump -i eth0 -w dump.pcap -c 1500 &
    chromium-browser --app http://domain.com &
    sleep 60
    killall chromium-browser
    sudo killall tcpdump

    # do some stuff with pcap file
    # it basically converts the pcap to plain text using tshark
    # then a PHP script parses the plain text

    sleep 240
done

正常に動作します。しかし、場合によっては、何らかの理由で何も強制終了されず、スクリプトがそのループステップでスタックします。実際には何もしておらず、リソースも使用していません。スクリプトは何かが殺されるのを待っているようです。

tcpdumpによってキャプチャされたパケットを制限しようとしましたが、機能しませんでした。tcpdumpは、強制終了せずに正常にジョブを終了しますが、スクリプトはクロムを強制終了せず、残りのコードを続行しません。

ステップに時間がかかりすぎているかどうかを検出し、すべてを強制終了して次のステップに進む方法はありますか?

アップデート

Theit is a long code

tsharkを使用してpcapファイルをプレーンテキストに変換し、PHPスクリプトがプレーンテキストを解析します。tsharkもPHPスクリプトも呼び出されないため、この部分では問題は発生しません。その前にすべてが停止します。

睡眠を増やす

問題を再現しません。

4

2 に答える 2

2

プロセスが正常に終了してもかまわない場合は、SIGHUPの代わりにSIGKILLを使用できます。

killall -9 chromium-browser
sudo killall tcpdump

ただし、この場合、開始したプロセスのpidをキャプチャし、それらのみを強制終了することをお勧めします(すべてのchromium-browersおよびtcpdumpインスタンスを強制終了するのではありません)。

$!を使用して、最後に実行されたプロセスのpidにアクセスできます。

sudo tcpdump -i eth0 -w dump.pcap -c 1500 &
tcpdump_pid=$!
chromium-browser --app http://domain.com &
chromium-browser_pid=$!
sleep 60
kill -9 $tcpdump_pid
sudo kill $chromium-browser_pid

「ステップに時間がかかりすぎているかどうかを検出し、すべてを強制終了して次のステップに進む方法はありますか?」という質問に答えるには。timeoutcoreutilsでユーティリティを使用することをお勧めします。

timeout 5 sudo kill -9 $chromium-browser_pid

これを回避するのではなく、なぜこれがハングしているのかを判断することをお勧めします。そうしないと、リソースリークが発生します。タイムアウトの観点からループを書き直す方が適切です。

sudo timeout 60 tcpdump -i eth0 -w dump.pcap -c 1500 &
timeout 60 chromium-browser --app http://domain.com &
于 2012-11-21T14:17:10.280 に答える
0
sudo tcpdump -Z root -w dump.pcap -n -i eth0 -G 300 -W 1
G-タイムアウト秒(タイムアウト期間の後、コンマは自動的に強制終了されます)

Z-ルートを削除し、ユーザー権限として実行します

W-保存するファイルの数(分割ファイルとして)
于 2015-03-04T08:45:02.893 に答える