Есть ли способ заставить Ubuntu не приостанавливать процесс загрузки?

Есть ли способ?

Как выполнить сценарий в /usr/lib/pm-utils/sleep.d для проверки ${downspeed eth0}, ${upspeed wlan0}, ${upspeed eth0} и ${downspeed wlan0} и настроить систему не приостанавливать работу во время загрузки, а только выключать экран?

Моя ОС - Ubuntu 15.04.

4
задан 27 August 2015 в 08:34

3 ответа

Вдохновленный @ByteCommanders вторым комментарием, сценарий ниже делает то, что Вы описываете: принятие папки загрузок является каталогом, который Вы загружаете в , это отключает, приостанавливают во время загрузки, и впоследствии ожидает в течение пяти минут (произвольный для установки) прежде пере - включение приостанавливает, чтобы удостовериться, что загрузка действительно закончена.
Вы можете устанавливать любой другой каталог, который будет наблюдаться как папка загрузки.

, Как это работает

В цикле (однажды в 20 секунд), сценарий проверяет размер целенаправленной папки с командой:

du -ks ~/Downloads

сценарий выдерживает сравнение, каждый сверяется с последним, для проверки на действие загрузки (увеличение размера). Если нет никакого действия в течение более затем пяти минут (но можно установить любых других, "ожидают" время), сценарий предполагает, что никакая загрузка не входит, и "нормальный" приостанавливают, (пере-), включил.

наоборот: если сценарий видит увеличивающийся размер ~/Downloads каталог, он отключает, приостанавливают, пока никакое действие не было обнаружено в течение более затем пяти минут.

Низко на соке

команды сценария являются чрезвычайно низкими на ресурсах. Так как цикл работает только однажды в 20 секунд (как это), загрузка процессора не практически ни один.

сценарий

#!/usr/bin/env python3
import subprocess
import time

#--- set suspend time below (seconds)
suspend_wait = 300
#---

#--- you can change values below, but I'd leave them as they are
speed_limit = 0      # set a minimum speed (kb/sec) to be considered a download activity
looptime = 20        # time interval between checks
download_wait = 300  # time (seconds) to wait after the last download activity before suspend is re- activated
#---

t = 0
key = ["gsettings", "get", "org.gnome.settings-daemon.plugins.power", "sleep-inactive-ac-timeout", "set"]

set_suspend = key[0]+" "+key[-1]+" "+(" ").join(key[2:4])
get_suspend = (" ").join(key[0:4])

def get_size():
    return int(subprocess.check_output(["/bin/bash", "-c", cmd]).decode("utf-8").split()[0])

def get(cmd):
    return subprocess.check_output(["/bin/bash", "-c", cmd]).decode("utf-8")

check_1 = int(get("du -ks ~/Downloads").split()[0])

while True:
    time.sleep(looptime)
    try:
        check_2 = int(get("du -ks ~/Downloads").split()[0])
    except subprocess.CalledProcessError:
        pass
    speed = int((check_2 - check_1)/looptime)
    # check current suspend setting
    suspend = get(get_suspend).strip()
    if speed > speed_limit:
        # check/set disable suspend if necessary
        if suspend != "0":
            subprocess.Popen(["/bin/bash", "-c", set_suspend+" 0"])
        t = 0
    else:
        if all([t > download_wait/looptime, suspend != str(download_wait)]):
            # check/enable suspend if necessary
            subprocess.Popen(["/bin/bash", "-c", set_suspend+" "+str(suspend_wait)])
    check_1 = check_2
    t = t+1

, Как использовать

  1. Копия сценарий ниже в пустой файл, сохраняет его как no_suspend.py
  2. В главном разделе сценария, установил желаемое "нормальное", приостанавливают время (так как сценарий будет пере - включать, приостанавливают):

    #--- set suspend time below (seconds)
    suspend_wait = 300
    #---
    
  3. , Если Вы хотите, Вы можете устанавливать другие значения:

    #--- you can change values below, but I'd leave them as they are
    speed_limit = 0      # set a minimum speed (kb/sec) to be considered a download activity
    looptime = 20        # time interval between checks
    download_wait = 300  # time (seconds) to wait after the last download activity before suspend is re- activated
    #---
    
  4. Тестовый прогон сценарий с командой:

    python3 /path/to/no_suspend.py
    
  5. , Если все хорошо работает, добавьте его к своим приложениям запуска: Тире> Приложения Запуска> добавляет команду:

    python3 /path/to/no_suspend.py
    
7
ответ дан 27 August 2015 в 08:34

На основе ответа, предоставленного здесь , я изменил сценарий @Jacob Vlijm следующим образом, чтобы препятствовать Ubuntu, приостанавливают, в то время как любая загрузка или загружает происходящий. Необходимо установить xprintidle сначала.

#!/usr/bin/env python3
#install xprintidle first, it is a binary written in C; see  https://packages.debian.org/sid/xprintidle 
#This script is for prevent/supersede suspend while a download/upload in progress.
#Change wlan0 (wifi) to eth0 (ethernet) or use both if its applies. 
#add it to your startup applications: Dash > Startup Applications > add the command: python3 /path/to/delay_suspend.py
import subprocess
import time
time.sleep(15)
subprocess.Popen(['notify-send', "Ubuntu will supersede suspend while a download/upload in progress"])    

#--- set suspend time below (seconds)
suspend_wait = 300
#---

#--- you can change values below, but I'd leave them as they are
speed_limit = 1000      # set a minimum speed (bytes/looptime) to be considered a download activity
looptime = 20       # time interval between checks
download_wait = 300  # time (seconds) to wait after the last download activity before suspend is re- activated
#---

rx_speed=0
tx_speed=0
speed=0
idletime = 2

t = 0
key = ["gsettings", "get", "org.gnome.settings-daemon.plugins.power", "sleep-inactive-ac-timeout", "set"]

set_suspend = key[0]+" "+key[-1]+" "+(" ").join(key[2:4])
get_suspend = (" ").join(key[0:4])

def get_size():
    return int(subprocess.check_output(["/bin/bash", "-c", cmd]).decode("utf-8").split()[0])

def get(cmd):
    return subprocess.check_output(["/bin/bash", "-c", cmd]).decode("utf-8")



def get_bytes(t, iface='wlan0'):
    with open('/sys/class/net/' + iface + '/statistics/' + t + '_bytes', 'r') as f:
        data = f.read();
    return int(data)

if __name__ == '__main__':
    (tx_prev, rx_prev) = (0, 0)
#Rx stand for received (download) and Tx for tranferred (upload).
    while(True):
        tx = get_bytes('tx')
        rx = get_bytes('rx')

        if tx_prev > 0:
            tx_speed = tx - tx_prev


        if rx_prev > 0:
            rx_speed = rx - rx_prev


        time.sleep(looptime)

        tx_prev = tx
        rx_prev = rx

        speedrx =rx_speed/looptime
        #print('RX: ', rx_speed, 'xxxxx')
        speedtx = tx_speed/looptime
        if speedtx > speedrx:
            speed = speedtx
        else:
            speed = speedrx


    # check current suspend setting
        suspend = get(get_suspend).strip()
        idletime = float(subprocess.check_output('xprintidle').strip())
        idletime=idletime/1000
        if speed > speed_limit:
            # check/set disable suspend if necessary
            if suspend != "0":
                subprocess.Popen(["/bin/bash", "-c", set_suspend+" 0"])

            if idletime >  download_wait-2*looptime:
                subprocess.Popen(['notify-send', "Postponed suspend due to active net traffic"]) 
                    #subprocess.Popen(['notify-send', str(speed) +"Postponed suspend for completion of active upload/download"+ str(speed_limit)])  
            t = 0
        else:
            if all([t > download_wait/looptime, suspend != str(download_wait)]):
                # check/enable suspend if necessary
                subprocess.Popen(["/bin/bash", "-c", set_suspend+" "+str(suspend_wait)])

        t = t+1
        #print(idletime)
        #print(speed)
        #print(speed_limit)        
        #subprocess.Popen(['notify-send', str(idletime)])
        #print('speed:', speed)
        #print('speed limit:', speed_limit)
3
ответ дан 27 August 2015 в 08:34

ОБНОВЛЕНИЕ (2016-06-11): Начиная с первой записи сценария под ним превратился в полноценную программу, которая определяет, когда приостановить на основе

  1. Сетевой трафик
  2. Пользовательское действие
  3. Загрузка ЦП

Я опубликовал его на Панели запуска здесь https://launchpad.net/keep.awake в соответствии с лицензией GPL.

Еще нет никакого поспешного пакета или deb, но я найду время для него в конечном счете. Тем временем можно загрузить это и распаковать его для использования.

Это работает как надлежащая команда.
Введите - помогают видеть, что полное перечисляет того, что может быть сделано. Примеры внизу - только некоторые:
./keepawake.py --help

Работать в интерактивном режиме:
./keepawake.py

Работать как фоновый сервис:
nohup ./keepawake.py -r > /dev/null 2>&1 &

Чтобы работать как фоновый сервис и установить 15 минут (900 секунд) как пользовательское время простоя действия, прежде чем это решит, что пользователь неактивен:
nohup ./keepawake.py -u 900 -r > /dev/null 2>&1 &

Работать как фоновый сервис и установить минимальную загрузку ЦП как 13%:
nohup ./keepawake.py -c 13 -r > /dev/null 2>&1 &

Работать как фоновый сервис и установить минимальный сетевой трафик как 5 КБ (5 120 байтов):
nohup ./keepawake.py -s 5120 -r > /dev/null 2>&1 &

Для выполнения всех трех настроек выше (сеть, ЦП, неактивный Пользователь) в том, пойдите:

nohup ./keepawake.py -s 5120 -c 13 -u 900 -r > /dev/null 2>&1 &


[ИСХОДНОЕ СООБЩЕНИЕ]:

На основе ответа dhiya я в большой степени изменил сценарий. Это обрабатывает и сетевой трафик И пользователя acitvity!

Я должен был назвать его чем-то так, что я назвал его, "Бодрствуют".

Дайте ему вращение и ответьте назад, если у Вас есть какие-либо вопросы или комментарии!

Примечания к выпуску...

  1. Проверки и пользовательское действие и сетевой трафик на основе порогов
  2. Если или или оба выше пороговых пределов, приостанавливать-параметры-питания ОС отключены.
  3. Моя первая модификация кода понизила его до Python 2.7.x, я должен был переместить его назад в 3.4.x
  4. Реализованный печать, которая переходит к файлу журнала и в стандартному выводу с помощью Python 3 возможности.
  5. Добавленный много данных печатает для определения состояния. Очень полезный для поиска и устранения неисправностей.
  6. В логике If-elif-else я добавил обратные счетчики количества.
  7. Добавленный много комментариев, надо надеяться, помогает плохо знакомым со всем этим.
  8. Связали logrotate конфигурацию, которую можно использовать для управления выходными журналами неограниченно долго навсегда. (См. Комментарии в Истории),
  9. Настоятельно рекомендовано, что logrotate крон перемещен в cron.hourly
  10. Использует xprintidle
  11. конфигурация logrotate использует xz-utils
  12. Повторный тест производительности показал, что влияние на ЦП фактически незначительно. Только xz алгоритм сжатия, выполненный logrotate, может повлиять на одноядерные 100%. Но это не длится долго на современных CPU плюс он, является единственным, распараллелил. Таким образом, Ваши другие ядра могут сделать другую работу. Это только сожмет журналы, которые несколько дней или, если больше, чем 20 МБ.
  13. После того как Вы довольны конфигурацией, можно установить ее использование встроенного средства запуска Приложений Запуска дистрибутива, которое запустит программу после входа в систему учетной записи. Удостоверьтесь, что у Вас есть logrotate, настроенный с конфигурацией сценария внизу для управления файлами журнала. Можно настроить это к удовольствию также.
  14. 16/09/2015 - версия 2.1 - Добавленная Сила Корректная логика Приостановки
  15. 16/09/2015 - версия 2.1 - Программа теперь разработана для выполнения с sudo полномочием и журналом к/var/log/Keep. Проснитесь конфигурация/. logrotate будет теперь принимать значение по умолчанию к многоядерной обработке для сжатия и только вращаться, если больше, чем 1M. Это требует xz-utils> = v5.2.0

Демонстрационная команда для выполнения в фоне

    $ sudo nohup python3 Keep\ Awake.v2.py > /dev/null 2>&1 &

ИМЯ ФАЙЛА: "Не спящий v2.py Keep\"

    #!/usr/bin/env python3

    import subprocess
    import time
    import logging
    import datetime
    import sys


    #--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    # Keep Awake
    # version: 2.1
    #
    # PURPOSE:
    # This program will check 'network traffic' AND 'user activity' and decide whether to enable the timer to suspend or cancel it.
    #
    # METHOD:
    # The program checks the network traffic if it is greater than a certain treshold; if so it keeps the system awake; if not it checks for user activity.
    # If the user activity is idle for a time greater than a treshold then it sets the timer to suspend.
    # 
    # SAMPLE RUN COMMAND:
    # sudo nohup python3 Keep\ Awake.v2.py > /dev/null 2>&1 &
    #
    # History:
    # 2015-08-22    DanglingPointer - Modified from https://askubuntu.com/questions/576525/can-i-prevent-ubuntu-being-suspended-while-a-download-is-in-progress/661085#661085
    # 2015-09-12    DanglingPointer - Modified to version 2 and renamed "Keep Awake".  
    #                               - Version two now prints to standard output as well as a log file information useful for troubleshooting.
    #                               - Comes with a "Kee,Awake.v2.logrotate.config" file which can be used with linux logrotate.d.  It is recommended that logrotate be moved to cron.hourly.
    #                               - Upgraded coded from Python 2 to 3 using 2to3 command.
    #                               - Requires xprintidle linux package.
    # 2015-09-16    DanglingPointer - Modified to version 2.1.  Added logic to "gracefully force suspension" if automatic suspension fails to happen. This has been observed to happen when 
    #                               - the setting to require a password after suspension is enabled locking the desktop.  Keep.Awake.v2.1 will now send a dbus message to force graceful suspension.
    #                               - **NOTE 1** "Force Graceful suspension" will ONLY work in this version if the program is run as root (sudo privilege) after logging into a user account.
    #                               - **NOTE 2** "Force Graceful suspension" will NOT work if the program is sudo-run from command prompt without logging into a user desktop. (i.e. Fails when: run from CTL+ALT+F2 before login OR run from prompt after "switch user" is selected after locking desktop -> in that order)
    #--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


    # CONFIG
    suspend_wait    = 3600                              # set suspend time (seconds); In Ubuntu 14.04 it needs to be the equivalent of one of the options from the Power Settings or else it may not work.
    speed_limit     = 1024                              # set a minimum speed (bytes/second) to be considered a download activity
    looptime        = 20                                # time interval between checks (seconds)
    download_wait   = 300                               # time (seconds) to wait after the last download activity before suspend is re-activated.
    userIdle        = download_wait*1000                # user activity idle time in miliseconds before suspend is re-activated, requires xprintidle linux package
    forceGraceTime  = download_wait                     # time (seconds); in the event that the automatic suspend fails (like locked screen/user is at login screen) The system is given additional grace-time before a suspension is forced.
    logFileLocation = "/var/log/Keep.Awake/"            # Logfile location
    logFileName     = "Keep.Awake.log"                  # Logfile name

    # RATIOS
    download_waitTOlooptimeRatio    = download_wait/looptime
    suspend_waitTOlooptimeRatio     = suspend_wait/looptime
    forceGraceTimeTOlooptimeRatio   = forceGraceTime/looptime

    # STRING CONSTANTS
    key = ["gsettings", "get", "org.gnome.settings-daemon.plugins.power", "sleep-inactive-ac-timeout", "set"]
    dbusForceSuspend = ["dbus-send", "--print-reply", "--system", "--dest=org.freedesktop.UPower", "/org/freedesktop/UPower", "org.freedesktop.UPower.Suspend"]

    # WHERE TO OUTPUT
    logging.basicConfig(level=logging.INFO, format='%(message)s')
    logger = logging.getLogger()
    logger.addHandler(logging.FileHandler(logFileLocation + logFileName, 'a'))
    print = logger.info

    # VARIALBES
    rx_speed=0                  # receive speed
    tx_speed=0                  # transmit speed
    t = 0                       # time interval interation count
    countDown = 0               # count down integer
    downLoadWaitCountDown = 0   # count down for download_wait
    graceCountDown = 0          # count down for forced grace time. See comments above for forceGraceTime CONFIG
    graceFlag = False           # flag to provide grace period
    set_suspend = key[0]+" "+key[-1]+" "+(" ").join(key[2:4])
    get_suspend = (" ").join(key[0:4])
    force_suspend = (" ").join(dbusForceSuspend)

    print ("")
    print (">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>")
    print ("KEEP AWAKE v2.1")
    print ("Python version: " + (sys.version))
    print ("")
    print ("Program Date-Time Start: " + datetime.datetime.now().isoformat())
    print ("Configuration Loaded...")
    print ("suspend_wait: "     + str(suspend_wait)     + " - Time in seconds for setting 'Suspend when inactive for' for the OS.")
    print ("speed_limit: "      + str(speed_limit)      + " - Minimum amount of data in bytes to qualify as activity.")
    print ("looptime: "         + str(looptime)         + " - Time interval in seconds between checks for network activity.")
    print ("download_wait: "    + str(download_wait)    + " - Time in seconds to wait after last download activity before 'suspend_wait' is applied to the OS.")
    print ("userIdle: "         + str(userIdle)         + " - Idle time in miliseconds to wait before 'suspend_wait' is applied to the OS.")
    print ("forceGraceTime: "   + str(forceGraceTime)   + " - Time in seconds; in the event that the automatic suspend fails (like locked screen/user is at login screen), the system is given additional grace-time before a suspension is forced.")
    print ("logFileLocation: "  + logFileLocation       + " - Logfile location")
    print ("logFileName: "      + logFileName           + " - Logfile name")
    print ("")
    print ("Variables Loaded...")
    print ("rx_speed: "         + str(rx_speed)         + " - Received bytes in last interval")
    print ("tx_speed: "         + str(tx_speed)         + " - Transmited bytes in last interval")
    print ("set_suspend: "      + set_suspend           + " - String used to construct Shell command to set the 'Suspend when inactive for' for the OS.")
    print ("get_suspend: "      + get_suspend           + " - String used to construct Shell command to get the 'Suspend when inactive for' setting from the OS.")
    print ("force_suspend: "    + force_suspend         + " - String used to construct Shell command to force the 'Suspend.")
    print ("\n\n")


    def get(cmd):
        return subprocess.check_output(["/bin/bash", "-c", cmd]).decode("utf-8")

    def get_bytes(t, iface='eth0'):
        with open('/sys/class/net/' + iface + '/statistics/' + t + '_bytes', 'r') as f:
            data = f.read();
        return int(data)

    if __name__ == '__main__':
        (tx_prev, rx_prev) = (0, 0)

        while(True):
            print ("Interval Loop Started:\t" + datetime.datetime.now().isoformat())

            tx = get_bytes('tx')
            rx = get_bytes('rx')

            if tx_prev > 0:
                tx_speed = tx - tx_prev


            if rx_prev > 0:
                rx_speed = rx - rx_prev

            print (str(tx_speed) + " bytes TRANSMITTED in since last interval.")
            print (str(rx_speed) + " bytes RECEIVED in since last interval.")
            print ("Starting nap for " + str(looptime) + " seconds...")

            time.sleep(looptime)

            print ("Awaking from nap:\t" + datetime.datetime.now().isoformat())

            tx_prev = tx
            rx_prev = rx

            speedrx =rx_speed/looptime

            print ("RECEIVE speed: " + str(speedrx) + " bytes/second")

            speedtx = tx_speed/looptime

            print ("TRANSMIT speed: " + str(speedtx) + " bytes/second")

            if speedtx > speedrx:
                speed = speedtx
            else:
                speed = speedrx

            print ("Highest speed selected: " + str(speed) + " bytes/second")

            suspend = get(get_suspend).strip()

            print ("Speed Limit configured: " + str(speed_limit) + " bytes/second"   )
            print ("'t'-value loop counter: " + str(t))
            print ("'download_wait'/'looptime': " + str(download_waitTOlooptimeRatio))
            print ("'suspend' value == " + suspend)

            idleTime = int(get("xprintidle"))

            print ("User activity idle time: " + str(idleTime/1000) + " seconds")
            print ("User activity idle threshold limit: " + str(userIdle/1000) + " seconds")

            if speed > speed_limit or userIdle >= idleTime:
                # check/set disable suspend if necessary
                if suspend != "0":
                    subprocess.Popen(["/bin/bash", "-c", set_suspend+" 0"])
                t = 0
                graceFlag = False
                print ("Threshold limits breached... keeping system awake...")

            elif t > download_waitTOlooptimeRatio:
                # check/enable suspend if necessary
                subprocess.Popen(["/bin/bash", "-c", set_suspend+" "+str(suspend_wait)])
                countDown = suspend_waitTOlooptimeRatio - (t - download_waitTOlooptimeRatio)

                # hack logic - if countDown goes below zero, and automatic sleep fails --> force suspend provide grace period.
                if countDown < 0 and not graceFlag:
                    graceCountDown = -(countDown - forceGraceTimeTOlooptimeRatio)
                    graceFlag = True

                    print ("FORCE SUSPEND: Expected automatic sleep did not happen. User desktop session likely locked to login screen.")
                    print ("FORCE SUSPEND: Providing grace time before forcing suspension.")
                    print ("FORCE SUSPEND: Counting-down to FORCED suspend..." + str(graceCountDown))

                    graceCountDown = graceCountDown - 1

                elif countDown < 0 and graceFlag:
                    print ("FORCE SUSPEND: Counting-down to FORCED suspend..." + str(graceCountDown))
                    graceCountDown = graceCountDown - 1

                    if graceCountDown < 0:
                        print ("FORCE SUSPEND: Force Suspending...")

                        # prime graceFlag to False in case it comes back up to the same conditions allowing a new grace time
                        graceFlag = False

                        # execute suspend command
                        subprocess.call(force_suspend, shell=True)
                else:
                    print ("Cumulative activity below threshold limits... Counting-down to suspend..." + str(countDown))

            else:
                downLoadWaitCountDown = download_waitTOlooptimeRatio - t
                print ("Zero activity... Waiting before setting suspension count down..." + str(downLoadWaitCountDown))

            t = t+1
            print ("Interval Loop End:\t" + datetime.datetime.now().isoformat())
            print ("---------------------------------------------------------")

logrotate пользовательская конфигурация. Используйте "$man logrotate" для деталей его использования. Это очень удобно!... ИМЯ ФАЙЛА: "Сохраните. Не спящий v2.logrotate.config"

    /var/log/Keep.Awake/Keep.Awake.log
    {
            copytruncate
            size 1M
            rotate 30
            compress
            delaycompress
            compresscmd /usr/bin/xz
            compressext .xz
            compressoptions -9e --threads=0
            missingok
            notifempty
            extension .log
            create 664 root danglingpointer
            su root root
    }
4
ответ дан 27 August 2015 в 08:34

Другие вопросы по тегам:

Похожие вопросы: