Alat untuk mematikan sistem ketika tidak ada lalu lintas jaringan

13

Saya mencari skrip atau alat yang dapat saya nyalakan, bila diperlukan, yang mematikan komputer saya jika misalnya tidak ada lalu lintas jaringan misalnya 10 menit, atau di bawah 100kb misalnya.

Akan sangat berguna untuk mengunduh otomatis. Saya tahu ada kelemahan dalam hal ini, koneksi internet sedang hang, program unduh sedang hang, jadi jika Anda memiliki ide yang lebih baik, tolong beritahu saya.

Terima kasih sebelumnya.

cirkator
sumber

Jawaban:

15

Ada beberapa cara untuk menyelesaikannya, saya telah menulis skrip bash yang sangat sederhana yang dapat Anda gunakan untuk memantau kecepatan dalam KB p / s untuk antarmuka yang diinginkan, ketika kecepatan unduh turun di bawah minimum (yang dapat Anda atur) , maka komputer Anda akan dimatikan.

Beberapa hal yang perlu diingat di sini adalah:

  • Ini adalah skrip bash yang saya kumpulkan dengan cepat, ada banyak teknik berbeda untuk mencapai hasil yang sama, namun ini mudah dipahami dan diimplementasikan.

  • Anda perlu menjalankan skrip bash dari cron sebagai root , itu artinya Anda harus membuka cron sebagai pengguna root dan menambahkan cronjob seperti yang diinginkan. Alasannya perlu di cron root adalah bahwa Anda tidak akan dapat mematikan komputer dari baris perintah tanpa menjadi root, dan Anda tidak dapat menggunakan sudo saat Anda jauh dari keyboard. Ada beberapa cara untuk menyiasatinya, tetapi saya berusaha untuk membuatnya sesederhana mungkin.

  • Saya menggunakan alat linux bernama ifstat , jadi Anda harus menginstal ini kalau tidak skrip tidak akan berfungsi:

    sudo apt-get install ifstat
    
  • Ada 2 opsi yang dapat Anda modifikasi dalam skrip di bawah ini, INTERFACE dan MIN_SPEED . INTERFACE perlu diatur ke antarmuka yang Anda gunakan untuk mengunduh, baik eth0 untuk perangkat kabel Anda atau wlan0 untuk perangkat nirkabel Anda, Anda dapat menggunakan perintah ifconfig dari baris perintah untuk melihat antarmuka apa saja yang tersedia. MIN_SPEED diatur sesuai keinginan, dalam contoh saya, saya mengaturnya ke angka 5 , yang berarti bahwa jika kecepatan unduh saya kurang dari 5 KB per detik, maka komputer saya akan mati.

  • Terakhir, untuk meningkatkan skrip kita bisa menggunakan loop sementara dan memeriksa kecepatan unduhan selama periode waktu tertentu dan jika rata-rata kurang dari minimum kita akan mematikan, serta menjalankan skrip sebagai layanan, ini adalah cara yang lebih akurat dalam mendekati masalah dan saya akan dengan senang hati membantu Anda dengan itu jika ini adalah rute yang ingin Anda ikuti.

Salin dan tempel kode di bawah ini ke dalam file dalam direktori pilihan Anda di komputer Anda, contoh i_speed.sh , kemudian, sangat penting, buat file tersebut dapat dieksekusi , untuk melakukan ini dari baris perintah, jika file Anda dipanggil i_speed.sh sebagai berikut:

    chmod +x i_speed.sh 

Sekarang Anda dapat sudo -i untuk me-root dan mengatur cronjob Anda untuk memanggil skrip pada interval waktu yang Anda inginkan.

Kode untuk menyalin dan menempel ke file bernama 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

MEMPERBARUI

Saya menulis sebuah program python kecil sebagai pembaruan untuk skrip bash di atas yang memungkinkan Anda untuk mengatur variabel tambahan seperti coba lagi dan interval untuk mendapatkan kecepatan minimum rata-rata selama periode waktu tertentu. Pembaruan lebih lanjut akan mencakup GUI untuk program ini. Cukup salin dan tempel kode di bawah ini ke dalam file, contoh download_monitor.pykemudian jalankan sebagai berikutsudo 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()
kingmilo
sumber
TERIMA KASIH! Itulah yang saya inginkan! Saya akan coba ini besok, Nona sudah beres sekarang dan dia ingin waktu bebas linux ... Tapi itu skrip yang saya cari. Terima kasih
cirkator
Hai teman:) maaf saya tidak membalas lebih awal tetapi saya tidak menemukan waktu untuk mengujinya. Tapi ini BEKERJA:) Saya memikirkan lebih banyak tentang skrip, apakah mungkin memprogramnya sehingga berperilaku sedikit berbeda? Akan lebih bagus jika skrip dimulai saat startup, kemudian menunjukkan jendela kecil pada desktop, yang mengatakan: "Anda memiliki 3 menit untuk memasukkan misalnya" TIDAK "jika Anda ingin menghentikan skrip, jika tidak maka akan mematikan pc jika ada tidak ada lalu lintas jaringan (atau di bawah sesuatu) untuk misalnya periode 5 menit. "
cirkator
Dengan cara ini saya dapat memulai skrip melalui cron pada setiap startup tetapi jika saya secara fisik di pc dan saya tidak ingin skrip dijalankan saya dapat dengan mudah menonaktifkannya. Dan jika ini merupakan autostart terjadwal katakanlah pada jam 3. pagi hanya untuk mengunduh, itu akan menghitung mundur 3 menit dan kemudian mengatur skrip dalam "Go and monitor-mode". Juga mungkinkah skrip berjalan sepanjang waktu, dan teruskan memeriksa atau bisakah saya menjalankannya misalnya setiap menit dengan cron dan membiarkannya memeriksa tidak ada lalu lintas jaringan? TERIMA KASIH LAGI ANDA ADALAH MANUSIA :)
cirkator
@ Cirkator Saya senang ini bekerja untuk Anda. Tentu, semua opsi itu mungkin dan mungkin cara yang benar untuk melakukannya. Saya akan senang menulis program yang lebih resmi tetapi akan memakan waktu sedikit lebih lama. Setelah saya memiliki sesuatu di tempat saya akan membiarkan Anda menguji.
kingmilo
Luangkan semua waktu di dunia, saya hanya senang dengan pemikiran bahwa Anda sedang mengkodekan sesuatu untuk kami di waktu senggang Anda. Sangat dihargai! :)
cirkator
3

Saya menemukan topik ini sangat membantu. Tanpa pengetahuan Python, saya memperbarui skrip di atas untuk mendapatkan kecepatan jaringan rata-rata dan tidur lama jika kecepatan rata-rata lebih dari kecepatan minimum. Setelah lama tidur perhitungan diatur ulang dan kecepatan rata-rata dihitung lagi.

## 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()
pengguna3215145
sumber
Luar biasa. Jadi ini berarti cronjob ini harus dimulai hanya sekali, bukan?
Ben