Como posso desativar a suspensão durante o download, mas a tela ainda será desligada? [duplicado]

3

Estou no Ubuntu Gnome 15.10.

Estou baixando regularmente arquivos grandes (~ 800 MB), mas tenho uma conexão com a Internet muito lenta. Geralmente leva um tempo relativamente longo para baixá-lo. Como não estou trabalhando continuamente no laptop, ele entra automaticamente no modo de suspensão / hibernação.

Quando pressiono qualquer tecla depois que ela entra no modo de suspensão / hibernação, ela é ativada e me leva para a tela de login.

Consegui encontrar as configurações de energia, que deram surpreendentemente poucas opções:

No entanto, não tenho certeza sobre algumas coisas

Existe uma maneira em que meu computador não suspende durante os downloads, mas minha tela ainda está desligada quando não estou trabalhando nele durante o download? Existem configurações a serem feitas para alcançar isso ou outras soluções?

    
por AvZ 30.12.2015 / 17:52

1 resposta

1

Na borda de um dupe de esta questão . A diferença com essa questão é, no entanto, que você quer que o computador não seja suspenso, mas a tela ainda está desligada durante o download de arquivos grandes. Apesar de aparentemente ser uma pequena diferença, faz uma diferença substancial na resposta (script).

Sobre a solução

  • A solução é um script de segundo plano para ser executado como um Aplicativo de inicialização, que desativará a suspensão pelo tempo que o download levar.
  • Ao mesmo tempo, um segundo thread dentro do script, rastreia o tempo ocioso com a ajuda de xprintidle . xprintidle é acionado por eventos de teclado e mouse. Após um tempo arbitrário, para definir a cabeça do script, o thread desliga a (s) tela (s), enquanto o outro thread (main) impede a suspensão enquanto o download estiver ativo.

    O download é percebido por uma alteração no tamanho da pasta Downloads, medida por verificações periódicas, usando du -ks ~/Downloads ; se o tamanho da pasta não mudar mais durante cinco minutos, o script presume que o download esteja concluído. Então, e re habilita a suspensão.

Nota

  • Como sempre (- deve ser) com scripts de segundo plano, a carga adicional do processador é nula.

O script

#!/usr/bin/env python3
import subprocess
import time
from threading import Thread

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")


#--- set suspend time below (seconds)
suspend_wait = 300 # = 5 minutes
#--- set time after which screen should blackout (seconds)
blackout = 300 # = 5 minutes


#--- 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])
check_1 = int(get("du -ks ~/Downloads").split()[0])

def get_idle(blackout):
    shutdown = False
    while True:
        curr_idle = int(subprocess.check_output(["xprintidle"]).decode("utf-8").strip())/1000
        time.sleep(10)
        if curr_idle > blackout:
            if shutdown == False:
                subprocess.Popen(["xset", "-display", ":0.0", "dpms", "force", "off"])
                shutdown = True
                print("shutting down")
            else:
                pass
        else:
            shutdown = False

Thread(target=get_idle, args=(blackout,)).start()

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


Como usar

  1. O script usa xprintidle :

    sudo apt-get install xprintidle
    
  2. Copie o script abaixo em um arquivo vazio, salve-o como no_suspend.py

  3. Na seção principal do script, defina o tempo de suspensão "normal" desejado (já que o script reativará a suspensão) e o tempo até que você queira que a tela seja encerrada:

    #--- set suspend time below (seconds)
    suspend_wait = 300 # = 5 minutes
    #--- set time after which screen should blackout (seconds)
    blackout = 300 # = 5 minutes
    
  4. Se você quiser, você pode definir outros valores:

    #--- 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 (in seconds)
    download_wait = 300  # time (seconds) to wait after the last download activity before suspend is re- activated
    #---
    
  5. Teste- execute o script com o comando:

    python3 /path/to/no_suspend.py
    
  6. Se tudo funcionar bem, adicione-o aos seus aplicativos de inicialização: Dash > Aplicativos de inicialização > adicione o comando:

    python3 /path/to/no_suspend.py
    
por Jacob Vlijm 30.12.2015 / 22:08