Ağ trafiği olmadığında sistemi kapatma aracı


13

Örneğin, 10 dakika boyunca ağ trafiği yoksa veya örneğin 100kb'nin altında bir bilgisayar yoksa, gerektiğinde açabileceğim bir komut dosyası veya araç arıyorum.

Otomatik indirme için gerçekten kullanışlı olurdu. Bunun dezavantajları olduğunu biliyorum, internet bağlantısı asılı, indirme programı asılı, bu yüzden daha iyi bir fikriniz varsa, lütfen bana söyleyin.

Şimdiden teşekkürler.

Yanıtlar:


15

Bununla ilgili birkaç yol var , indirme hızı minimumun altına düştüğünde , istediğiniz bir arayüz için KB p / s hızını izlemek için kullanabileceğiniz çok basit bir bash betiği yazdım. , bilgisayarınız kapanacaktır.

Burada akılda tutulması gereken bazı şeyler şunlardır:

  • Bu, hızlı bir şekilde bir araya getirdiğim bir bash betiğidir, aynı sonucu elde etmek için birçok farklı teknik vardır, ancak bu anlaşılması ve uygulanması kolaydır.

  • Bash betiğini cron'dan root olarak yürütmeniz gerekir , yani cron'u root kullanıcısı olarak açmanız ve istediğiniz gibi bir cronjob eklemeniz gerekir. Kökün cronunda olması gerekmesinin nedeni, bilgisayarınızı root olmadan komut satırından kapatamayacağınız ve klavyeden uzaktayken sudo kullanamazsınız. Etrafında dolaşmanın yolları var ama mümkün olduğunca basit tutmaya çalışıyorum.

  • Ben ifstat adlı bir linux aracı kullanın , bu yüzden bunu yüklemeniz gerekir aksi takdirde komut dosyası çalışmaz:

    sudo apt-get install ifstat
    
  • Aşağıdaki kodda değiştirebileceğiniz 2 seçenek vardır, INTERFACE ve MIN_SPEED . INTERFACE'ın kablolu cihazınız için eth0 veya kablosuz cihazınız için wlan0 olarak indirmek için kullandığınız arayüze ayarlanması gerekir; hangi arayüzlere sahip olduğunuzu görmek için komut satırından ifconfig komutunu kullanabilirsiniz. MIN_SPEED istendiği gibi ayarlanır, benim örneğimde 5 numaraya ayarladım , bu da indirme hızım saniyede 5 KB'den azsa, bilgisayarımın kapanacağı anlamına gelir .

  • Son olarak, komut dosyasını geliştirmek için bir while döngüsü kullanabilir ve indirme hızını belirli bir süre boyunca kontrol edebiliriz ve ortalama minimumdan düşükse, komut dosyasını bir hizmet olarak çalıştırmanın yanı sıra kapanırdık Soruna yaklaşmanın daha doğru bir yolu ve takip etmek istediğiniz rota bu ise size yardımcı olmaktan memnuniyet duyarız.

Kopyalayıp bilgisayar, örnek üzerinde istediğiniz bir dizine bir dosyaya kodunun altına yapıştırın i_speed.sh , o zaman, çok önemli, dosya yürütülebilir hale dosya i_speed.sh çağrıldı eğer komut satırından bunu yapmak için, aşağıdaki gibi:

    chmod +x i_speed.sh 

Şimdi sudo -i'yi kök dizine kurabilir ve istediğiniz zaman aralıklarında komut dosyasını çağırmak için ayarlayabilirsiniz.

Kopyalamak ve i_speed.sh adlı bir dosyaya yapıştırmak için kod:

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

GÜNCELLEME

Belirli bir süre içinde ortalama bir min hızı elde etmek için yeniden deneme ve aralık gibi ek değişkenleri ayarlamanıza izin veren yukarıdaki bash betiğine bir güncelleme olarak küçük bir python programı yazdım. Diğer güncellemeler bu program için bir GUI içerecektir. Aşağıdaki kodu kopyalayıp bir dosyaya yapıştırın, örnek download_monitor.pysonra aşağıdaki gibi çalıştırınsudo 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()

TEŞEKKÜRLER! Bu tam olarak istediğim şey! Bunu yarın deneyeceğim, Missus'u şimdi bitirdim ve linuxfree zamanı istiyor ... Ama aradığım senaryo bu. Thanks
cirkator

Hey adam :) daha önce cevap vermediğim için üzgünüm ama test etmek için zaman bulamadım. Ama ÇALIŞIYOR :) Senaryo hakkında biraz daha düşündüm, biraz farklı davranacak şekilde programlamak mümkün mü? Komut dosyası başlangıçta başlarsa, masaüstünde küçük bir pencere gösterirse harika olur: "Komut dosyasını durdurmak istiyorsanız, örneğin" HAYIR "girmek için 3 dakikanız var, aksi takdirde pc'yi kapatır 5 dakikalık bir süre boyunca ağ trafiği (veya bir şeyin altında) yok. "
circator

Bu şekilde her başlangıçta cron üzerinden komut dosyasını başlatabilirim ama fiziksel olarak pc'deyim ve komut dosyasını çalıştırmak istemiyorsanız kolayca devre dışı bırakabilirim. Ve eğer programlanmış bir otomatik başlatma 3.am sadece indirme için söylese izin verirse, 3 dakika geri sayar ve sonra komut dosyasını "Git ve monitör modu" olarak ayarlar. Ayrıca komut dosyasının her zaman çalışmasını sağlamak ve kontrol etmeye devam etmek mümkün mü yoksa sadece cron ile her dakika çalıştırabilir ve ağ trafiği olup olmadığını kontrol edebilir miyim? SİZE TEKRAR TEŞEKKÜRLER :)
circator

@cirkator Sizin için çalıştığına sevindim. Elbette, tüm bu seçenekler mümkündür ve muhtemelen bunu yapmak için doğru yol. Daha resmi bir program yazmaktan mutluluk duyacağım, ancak bu biraz daha uzun sürecek. Yerde bir şeyim olduğunda test etmene izin vereceğim.
kingmilo

Dünyada her zaman zaman ayırın, boş zamanlarınızda bizim için bir şey kodladığınız düşüncesinden memnunum. Çok müteşekkirim! :)
cirkator

3

Bu konuyu çok yardımcı buldum. Hiçbir Python bilgisi olmadan, ortalama ağ hızını almak ve ortalama hız minimum hızdan fazla ise uzun uyku moduna geçmek için yukarıdaki komut dosyasını güncelledim. Uzun uykudan sonra hesaplamalar sıfırlanır ve ortalama hız tekrar hesaplanır.

## 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()

Muhteşem. Bu demek oluyor ki bu cronjob sadece bir kez başlatılmalı, değil mi?
Ben
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.