เครื่องมือในการปิดระบบเมื่อไม่มีการรับส่งข้อมูลเครือข่าย


13

ฉันกำลังมองหาสคริปต์หรือเครื่องมือที่ฉันสามารถเปิดใช้งานได้เมื่อจำเป็นซึ่งจะปิดคอมพิวเตอร์ของฉันหากไม่มีเช่นปริมาณการใช้เครือข่ายเช่น 10 นาทีหรือต่ำกว่า 100kb เช่น

จะมีประโยชน์จริงๆสำหรับการดาวน์โหลดอัตโนมัติ ฉันรู้ว่ามีข้อเสียในเรื่องนี้การเชื่อมต่ออินเทอร์เน็ตหยุดการดาวน์โหลดโปรแกรมหยุดทำงานดังนั้นหากคุณมีความคิดที่ดีกว่าโปรดบอกฉัน

ขอบคุณล่วงหน้า.

คำตอบ:


15

มีสองสามวิธีที่จะดำเนินการเกี่ยวกับเรื่องนี้ฉันได้เขียนสคริปต์ทุบตีง่ายๆที่คุณสามารถใช้เพื่อตรวจสอบความเร็วเป็นKB p / sสำหรับอินเทอร์เฟซที่ต้องการเมื่อความเร็วในการดาวน์โหลดลดลงต่ำกว่าขั้นต่ำ (ซึ่งคุณสามารถตั้งค่าได้) จากนั้นคอมพิวเตอร์ของคุณจะถูกปิด

สิ่งที่ต้องจำไว้ที่นี่คือ:

  • นี่เป็นสคริปต์ทุบตีที่ฉันรวบรวมไว้อย่างรวดเร็วมีเทคนิคต่าง ๆ มากมายเพื่อให้ได้ผลลัพธ์เดียวกัน แต่นี่เป็นวิธีที่เข้าใจง่ายและนำไปปฏิบัติ

  • คุณจะต้องรันสคริปต์ทุบตีจากcron ในฐานะ rootซึ่งหมายความว่าคุณต้องเปิด cron ในฐานะผู้ใช้รูทและเพิ่ม cronjob ตามต้องการ เหตุผลที่ต้องอยู่ใน cron ของ root คือคุณจะไม่สามารถปิดคอมพิวเตอร์ของคุณจากบรรทัดคำสั่งโดยไม่ต้องเป็น root และคุณไม่สามารถใช้ sudo ได้ในขณะที่คุณไม่อยู่ที่คีย์บอร์ด มีวิธีรับรอบ แต่ฉันพยายามทำให้ง่ายที่สุด

  • ฉันใช้เครื่องมือ linux ชื่อifstatดังนั้นคุณจะต้องติดตั้งสิ่งนี้มิฉะนั้นสคริปต์จะไม่ทำงาน:

    sudo apt-get install ifstat
    
  • มี 2 ตัวเลือกที่คุณสามารถแก้ไขในสคริปต์ด้านล่างที่INTERFACEและMIN_SPEED INTERFACE จะต้องตั้งค่าเป็นอินเทอร์เฟซที่คุณใช้ในการดาวน์โหลดไม่ว่าจะเป็น eth0 สำหรับอุปกรณ์แบบมีสายหรือ wlan0 สำหรับอุปกรณ์ไร้สายของคุณคุณสามารถใช้คำสั่งifconfigจากบรรทัดคำสั่งเพื่อดูอินเตอร์เฟสที่คุณมี MIN_SPEED ถูกตั้งค่าตามที่ต้องการในตัวอย่างของฉันฉันตั้งค่าเป็นหมายเลข5ซึ่งหมายความว่าหากความเร็วในการดาวน์โหลดของฉันน้อยกว่า5 KB ต่อวินาทีคอมพิวเตอร์ของฉันจะปิดเครื่อง

  • สุดท้ายเพื่อปรับปรุงสคริปต์เราสามารถใช้สักครู่ห่วงและตรวจสอบความเร็วการดาวน์โหลดในช่วงเวลาที่กำหนดและถ้าค่าเฉลี่ยน้อยกว่าขั้นต่ำที่เราจะปิดเช่นเดียวกับเรียกใช้สคริปต์เป็นบริการนี้เป็น วิธีที่แม่นยำยิ่งขึ้นในการเข้าถึงปัญหาและฉันยินดีที่จะช่วยคุณในเรื่องนี้หากเป็นเส้นทางที่คุณต้องการติดตาม

คัดลอกและวางรหัสด้านล่างลงในไฟล์ในไดเรกทอรีที่คุณเลือกบนคอมพิวเตอร์ของคุณเช่นi_speed.shจากนั้นสำคัญมากทำให้ไฟล์นั้นทำงานได้เพื่อทำสิ่งนี้จากบรรทัดคำสั่งหากไฟล์ของคุณชื่อ i_speed.sh ดังต่อไปนี้:

    chmod +x i_speed.sh 

ตอนนี้คุณสามารถ sudo -i เพื่อรูทและตั้งค่า 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

UPDATE

ฉันเขียนโปรแกรมหลามขนาดเล็กเป็นการอัปเดตของสคริปต์ทุบตีด้านบนซึ่งช่วยให้คุณตั้งค่าตัวแปรเพิ่มเติมเช่นการลองใหม่และช่วงเวลาเพื่อให้ได้ความเร็วขั้นต่ำเฉลี่ยในช่วงเวลาที่กำหนด การปรับปรุงเพิ่มเติมจะรวม 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()

ขอขอบคุณ! นั่นคือสิ่งที่ฉันต้องการ! ฉันจะลองวันนี้พรุ่งนี้ให้มีมิสไซล์อยู่ตอนนี้และเธอต้องการเวลาฟรีจากลินุกซ์ ... แต่นั่นก็คือสคริปต์ที่ฉันกำลังมองหา ขอบคุณ
cirkator

สวัสดี man:) ขอโทษที่ฉันไม่ได้ตอบก่อนหน้านี้ แต่ฉันไม่พบเวลาที่จะทดสอบ แต่มันกำลังทำงาน:) ฉันคิดเกี่ยวกับสคริปท์มากกว่านี้มันจะเป็นไปได้ไหมที่จะเขียนโปรแกรมเพื่อให้มันทำงานแตกต่างกันเล็กน้อย? มันจะดีถ้าสคริปต์เริ่มต้นเมื่อเริ่มต้นจากนั้นจะแสดงหน้าต่างเล็ก ๆ บนเดสก์ท็อปซึ่งบอกว่า: "คุณมี 3 นาทีเพื่อเข้าสู่เช่น" ไม่ "ถ้าคุณต้องการหยุดสคริปต์ถ้าไม่เช่นนั้นมันจะปิดพีซีถ้ามี ไม่มีทราฟฟิกเครือข่าย (หรือต่ำกว่าบางอย่าง) เช่นเป็นเวลา 5 นาที "
cirkator

วิธีนี้ฉันสามารถเริ่มต้นสคริปต์ผ่าน cron ทุกครั้งที่เริ่มต้น แต่ถ้าฉันอยู่ที่พีซีและฉันไม่ต้องการให้สคริปต์ทำงานฉันสามารถปิดการใช้งานได้อย่างง่ายดาย และถ้าการเริ่มอัตโนมัติเริ่มต้นเวลา 3.00 น. สำหรับการดาวน์โหลดมันจะนับถอยหลัง 3 นาทีจากนั้นตั้งค่าสคริปต์ใน "ไปและโหมดจอภาพ" นอกจากนี้ยังเป็นไปได้ที่สคริปต์จะทำงานตลอดเวลาและทำการตรวจสอบต่อไปหรือฉันจะสามารถรันสคริปต์เช่นทุก ๆ นาทีด้วย cron และปล่อยให้มันตรวจสอบว่าไม่มีทราฟฟิกเครือข่ายหรือไม่? ขอบคุณอีกครั้งคุณเป็นคน :)
cirkator

@cirkator ฉันดีใจที่มันทำงานให้คุณ แน่นอนว่าตัวเลือกทั้งหมดนั้นเป็นไปได้และอาจเป็นวิธีที่ถูกต้องในการดำเนินการ ฉันยินดีที่จะเขียนโปรแกรมเป็นทางการมากขึ้น แต่จะใช้เวลานานกว่านี้เล็กน้อย เมื่อฉันมีบางสิ่งในสถานที่ฉันจะให้คุณทดสอบ
kingmilo

ใช้เวลาทั้งหมดในโลกนี้ฉันมีความสุขกับความคิดที่ว่าคุณกำลังเขียนโปรแกรมบางอย่างสำหรับเราในเวลาว่าง ชื่นชมมาก! :)
cirkator

3

ฉันพบว่าหัวข้อนี้มีประโยชน์มาก ด้วยความรู้ของ 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()

น่ากลัว ดังนั้นนี่หมายความว่า cronjob นี้จะต้องเริ่มต้นเพียงครั้งเดียวใช่มั้ย
เบ็
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.