Công cụ tắt hệ thống khi không có lưu lượng mạng


13

Tôi đang tìm kiếm một tập lệnh hoặc một công cụ mà tôi có thể bật, khi cần, sẽ tắt máy tính của tôi nếu không có lưu lượng truy cập mạng trong 10 phút, hoặc dưới 100kb chẳng hạn.

Sẽ thực sự tiện dụng để tải xuống tự động. Tôi biết có những nhược điểm này, kết nối internet bị treo, chương trình tải xuống bị treo, vì vậy nếu bạn có ý tưởng tốt hơn, xin vui lòng cho tôi biết.

Cảm ơn trước.

Câu trả lời:


15

Có một vài cách để giải quyết vấn đề này, tôi đã viết một tập lệnh bash rất đơn giản mà bạn có thể sử dụng để theo dõi tốc độ tính bằng KB cho giao diện mong muốn, khi tốc độ tải xuống giảm xuống dưới mức tối thiểu (bạn có thể đặt) , sau đó máy tính của bạn sẽ được tắt máy.

Một số điều cần ghi nhớ ở đây là:

  • Đây là một kịch bản bash mà tôi kết hợp nhanh chóng, có nhiều kỹ thuật khác nhau để đạt được cùng một kết quả, tuy nhiên đây là một kịch bản dễ hiểu và dễ thực hiện.

  • Bạn sẽ cần phải thực thi tập lệnh bash từ cron là root , điều đó có nghĩa là bạn cần mở cron với tư cách là người dùng root và thêm một cronjob như mong muốn. Lý do cần có trong cron của root là bạn sẽ không thể tắt máy tính của mình khỏi dòng lệnh mà không cần root và bạn không thể sử dụng sudo khi bạn rời khỏi bàn phím. Có nhiều cách để khắc phục nó nhưng tôi đang cố gắng giữ nó đơn giản nhất có thể.

  • Tôi sử dụng một công cụ linux có tên ifstat , vì vậy bạn sẽ cần cài đặt cái này nếu không đoạn script sẽ không hoạt động:

    sudo apt-get install ifstat
    
  • Có 2 tùy chọn mà bạn có thể sửa đổi trong tập lệnh bên dưới, đó là INTERFACEMINinksEED . INTERFACE cần được đặt thành giao diện bạn đang sử dụng để tải xuống, eth0 cho thiết bị có dây hoặc wlan0 cho thiết bị không dây của bạn, bạn có thể sử dụng lệnh ifconfig từ dòng lệnh để xem giao diện nào bạn có sẵn. MINinksEED được đặt như mong muốn, trong ví dụ của tôi, tôi đặt nó thành số 5 , có nghĩa là nếu tốc độ tải xuống của tôi dưới 5 KB mỗi giây thì máy tính của tôi sẽ tắt.

  • Cuối cùng, để cải thiện tập lệnh, chúng tôi có thể sử dụng vòng lặp while và kiểm tra tốc độ tải xuống trong một khoảng thời gian xác định và nếu trung bình nhỏ hơn mức tối thiểu, chúng tôi sẽ tắt máy, cũng như chạy tập lệnh dưới dạng dịch vụ, đây là một cách tiếp cận vấn đề chính xác hơn và tôi sẽ sẵn lòng giúp bạn với điều đó nếu đây là con đường bạn muốn đi theo.

Sao chép và dán mã dưới đây vào một tệp trong thư mục bạn chọn trên máy tính của mình, ví dụ i_speed.sh , sau đó, rất quan trọng, làm cho tệp có thể thực thi được , để thực hiện điều này từ dòng lệnh, nếu tệp của bạn được gọi là i_speed.sh như sau:

    chmod +x i_speed.sh 

Bây giờ bạn có thể sudo -i để root và thiết lập cronjob của bạn để gọi tập lệnh theo các khoảng thời gian mà bạn mong muốn.

Mã để sao chép và dán vào một tệp có tên 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

CẬP NHẬT

Tôi đã viết một chương trình python nhỏ dưới dạng cập nhật cho tập lệnh bash ở trên, cho phép bạn đặt các biến bổ sung như thử lại và khoảng thời gian để có tốc độ tối thiểu trung bình trong một khoảng thời gian xác định. Cập nhật thêm sẽ bao gồm một GUI cho chương trình này. Chỉ cần sao chép và dán mã dưới đây vào một tệp, ví dụ download_monitor.pysau đó chạy nó như sausudo 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()

CẢM ƠN! Đó chính xác là những gì tôi muốn! Tôi sẽ thử điều này vào ngày mai, Có ngay lập tức và cô ấy muốn có thời gian rảnh rỗi ... Nhưng đó là kịch bản mà tôi đang tìm kiếm. Cảm ơn
cirkator

Hey man :) xin lỗi vì tôi đã không trả lời sớm hơn nhưng tôi không có thời gian để kiểm tra nó. Nhưng đó là LÀM VIỆC :) Tôi đã nghĩ thêm về kịch bản, liệu có thể lập trình nó để nó hành xử hơi khác một chút không? Sẽ thật tuyệt nếu tập lệnh khởi động khi khởi động, sau đó hiển thị một cửa sổ nhỏ trên màn hình, có nội dung: "Bạn có 3 phút để nhập ví dụ" KHÔNG "nếu bạn muốn dừng tập lệnh, nếu không nó sẽ tắt máy tính nếu có không có lưu lượng truy cập mạng (hoặc dưới một cái gì đó) trong khoảng thời gian 5 phút. "
cirkator

Bằng cách này, tôi có thể khởi động tập lệnh thông qua cron khi khởi động nhưng nếu tôi thực sự ở máy tính và tôi không muốn tập lệnh chạy thì tôi có thể dễ dàng vô hiệu hóa nó. Và nếu tính năng tự động khởi động theo lịch trình cho phép vào lúc 3 giờ sáng chỉ để tải xuống, nó sẽ đếm ngược 3 phút và sau đó đặt tập lệnh ở chế độ "Đi và theo dõi". Ngoài ra, có thể chạy tập lệnh mọi lúc không, và tiếp tục kiểm tra hoặc tôi chỉ có thể chạy tập lệnh đó, ví dụ như mỗi phút với cron và để nó kiểm tra không có lưu lượng mạng? THANKS LẠI BẠN LÀ MAN :)
cirkator

@cirkator Tôi rất vui vì nó hiệu quả với bạn. Chắc chắn, tất cả các tùy chọn là có thể và có thể là cách chính xác để thực hiện nó. Tôi sẽ rất vui khi viết một chương trình chính thức hơn nhưng sẽ mất nhiều thời gian hơn. Một khi tôi có một cái gì đó, tôi sẽ cho phép bạn kiểm tra.
kingmilo

Dành tất cả thời gian trên thế giới, tôi chỉ vui khi nghĩ rằng bạn đang mã hóa thứ gì đó cho chúng tôi trong thời gian rảnh rỗi. Rất nhiều đánh giá cao! :)
lập kế hoạch

3

Tôi thấy chủ đề này rất hữu ích. Không có kiến ​​thức về Python, tôi đã cập nhật tập lệnh trên để có tốc độ mạng trung bình và đi vào giấc ngủ dài nếu tốc độ trung bình cao hơn tốc độ tối thiểu. Sau khi tính toán giấc ngủ dài được thiết lập lại và tốc độ trung bình được tính lại.

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

Tuyệt vời. Vì vậy, điều này có nghĩa là cronjob này phải được bắt đầu chỉ một lần, phải không?
Ben
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.