回答:
これにはいくつかの方法がありますが、ダウンロード速度が最小値(設定可能)を下回ったときに、目的のインターフェースのKB p / sで速度を監視するために使用できる非常に簡単なbashスクリプトを書きました、その後、コンピューターがシャットダウンされます。
ここで心に留めておくべきことがいくつかあります:
これは私がすばやくまとめたbashスクリプトです。同じ結果を達成するためのさまざまな手法がありますが、これは理解して実装するのが簡単なものです。
rootとしてcronからbashスクリプトを実行する必要があります。つまり、cronをrootユーザーとして開き、必要に応じてcronjobを追加する必要があります。rootのcronに配置する必要があるのは、rootにならないとコマンドラインからコンピューターをシャットダウンできず、キーボードから離れている間はsudoを使用できないためです。それを回避する方法はありますが、できるだけシンプルに保つようにしています。
私はifstatというLinuxツールを使用しているため、これをインストールする必要があります。そうしないと、スクリプトが機能しません。
sudo apt-get install ifstat
以下のスクリプトで変更できる2つのオプション、INTERFACEとMIN_SPEEDがあります。INTERFACEは、ダウンロードに使用するインターフェイス(有線デバイスの場合はeth0、ワイヤレスデバイスの場合はwlan0)に設定する必要があります。コマンドラインからifconfigコマンドを使用して、使用可能なインターフェイスを確認できます。MIN_SPEEDは、必要に応じて、設定私の例では、私は数に設定された5私のダウンロード速度未満であればということ、毎秒5キロバイトその後、私のコンピュータのシャットダウンします。
最後に、スクリプトを改善するために、whileループを使用して、指定された期間にわたってダウンロード速度を確認し、平均が最小値を下回る場合はシャットダウンし、スクリプトをサービスとして実行します。問題にアプローチするより正確な方法であり、これがあなたが辿りたいルートである場合、私はあなたを支援させていただきます。
次のコードをコピーして、コンピューター上の任意のディレクトリにあるファイル(例:i_speed.sh)に貼り付けます。ファイルがi_speed.shという場合は、ファイルを実行可能にし、コマンドラインから実行します。次のように:
chmod +x i_speed.sh
これで、sudo -iでrootになり、cronjobをセットアップして、希望する時間間隔でスクリプトを呼び出すことができます。
i_speed.shというファイルにコピーして貼り付けるコード:
#!/bin/bash
# Bash script to determine a network interfaces current transfer speed and
shutdown the computer if the current transfer speed is less than MIN_SPEED
# Set INTERFACE to the network interface you would like to monitor
INTERFACE='wlan0'
# Set MIN_SPEED in KB per second that network interface (INTERFACE) speed
must be larger than, if speed falls below this number then computer will shutdown.
MIN_SPEED=5
# This is where the work get's done:
CURRENT_SPEED=`ifstat -i $INTERFACE 1 1 | awk '{print $1}' | sed -n '3p'`
INT=${CURRENT_SPEED/\.*}
if [ $INT -lt $MIN_SPEED ]; then
shutdown -h now
else
exit
fi
更新
上記のbashスクリプトの更新として小さなpythonプログラムを作成しました。これにより、再試行や間隔などの追加変数を設定して、指定した期間の平均最小速度を取得できます。今後の更新には、このプログラムのGUIが含まれます。以下のコードをコピーしてファイルに貼り付けてください。download_monitor.py
次に、次のように実行しますsudo python download_monitor.py
## Download Monitor v0.1 - March 2012
# Set the interface you wish to monitor, eg: eth0, wlan0, usb0
INTERFACE = "eth0"
# Set the minimum download speed in KB/s that must be achieved.
MINIMUM_SPEED = 15
# Set the number of retries to test for the average minimum speed. If the average speed is less
# than the minimum speed for x number of retries, then shutdown.
RETRIES = 5
# Set the interval (in seconds), between retries to test for the minimum speed.
INTERVAL = 10
import os, time
from commands import getoutput
def worker ():
RETRIES_COUNT = RETRIES
while True:
SPEED = int(float(getoutput("ifstat -i %s 1 1 | awk '{print $1}' | sed -n '3p'" % INTERFACE)))
if (SPEED < MINIMUM_SPEED and RETRIES_COUNT <= 0):
os.system("shutdown -h now")
elif SPEED < MINIMUM_SPEED:
RETRIES_COUNT -= 1
time.sleep(INTERVAL)
else:
RETRIES_COUNT = RETRIES
time.sleep(INTERVAL)
worker()
このトピックは非常に役立ちました。Pythonの知識がなくても、上記のスクリプトを更新して平均ネットワーク速度を取得し、平均速度が最低速度を超える場合は長時間スリープ状態にします。長いスリープの計算がリセットされ、平均速度が再び計算された後。
## Download Monitor v0.2 - June 2017
# Set the interface you wish to monitor, eg: eth0, wlan0, usb0
INTERFACE = "enp4s0"
# Set the minimum download speed in KB/s that must be achieved.
MINIMUM_SPEED = 10
# Set the number of retries to test for the average minimum speed.
RETRIES = 5
# Set the interval (in seconds), between retries to calculate average speed.
INTERVAL = 5
# Set the interval (in seconds), between recalculating average speed
LONG_INTERVAL = 600
import os, time
from commands import getoutput
def worker ():
RETRIES_COUNT = 1
SPEED = 0
while True:
# Sum downstream and upstream and add with previous speed value
# {print $1} use just downstream
# {print $2} use just upstream
# {print $1+$2} use sum of downstream and upstream
SPEED += int(float(getoutput("ifstat -i %s 1 1 | awk '{print $1+$2}' | sed -n '3p'" % INTERFACE)))
if RETRIES_COUNT > RETRIES:
# Calculate average speed from all retries
AVG_SPEED = int(float(SPEED) / float(RETRIES_COUNT))
# If average speed is below minimum speed - suspend
if AVG_SPEED < MINIMUM_SPEED:
os.system("shutdown -h now")
# Else reset calculations and wait for longer to retry calculation
else:
RETRIES_COUNT = 1
SPEED = 0
time.sleep(LONG_INTERVAL)
else:
RETRIES_COUNT += 1
time.sleep(INTERVAL)
worker()