web-dev-qa-db-ja.com

ダウンロード中にサスペンドを無効にできますが、画面はまだシャットダウンしますか?

Ubuntu Gnome 15.10。を使用しています。

定期的に大きなファイル(〜800 MB)をダウンロードしていますが、インターネット接続が非常に遅いです。通常、ダウンロードには比較的長い時間がかかります。私はラップトップで継続的に作業していないため、自動的にスリープ/休止状態モードになります。

スリープ/ハイバネーションモードに移行した後にキーを押すと、キーが起動し、ログイン画面に移動します。

電源設定を見つけることができましたが、驚くほど少数のオプションがありました:

power options

しかし、私はいくつかのことについて確信がありません

ダウンロード中にコンピューターがサスペンドしない方法がありますが、ダウンロード中にコンピューターで作業していない場合、画面はまだオフになっていますか?これを達成するために行うべき設定、または他の解決策はありますか?

2
AvZ

この質問 のだましの端に。ただし、その質問との違いは、コンピューターを中断させたくないが、それでも大きなファイルをダウンロードしている間は画面が止まることです。一見小さな違いに見えますが、doesは回答(スクリプト)に大きな違いをもたらします。

ソリューションについて

  • 解決策は、バックグラウンドスクリプトであり、スタートアップアプリケーションとして実行します。これにより、ダウンロードに時間がかかる限り、サスペンドが無効になります。
  • 同時に、スクリプト内の2番目のスレッドは、xprintidleを使用してアイドル時間を追跡します。 xprintidleは、キーボードイベントとマウスイベントによってトリガーされます。任意の時間の後、スクリプトの先頭に設定するために、スレッドは画面をシャットダウンしますが、ダウンロードがアクティブである限り、他の(メイン)スレッドは中断を防ぎます。

    ダウンロードは、du -ks ~/Downloads;を使用して定期的にチェックすることにより測定される、ダウンロードフォルダーのサイズの変更によって認識されます。フォルダーのサイズが5分間変更されない場合、スクリプトはダウンロードが完了したと見なします。その後、サスペンドを再度有効にします。

注意

  • バックグラウンドスクリプトでは常に(-が必要です)、追加のプロセッサ負荷はnihilです。

スクリプト

#!/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


使い方

  1. スクリプトはxprintidleを使用します。

    Sudo apt-get install xprintidle
    
  2. 以下のスクリプトを空のファイルにコピーし、no_suspend.pyとして保存します

  3. スクリプトのheadセクションで、目的の「通常の」サスペンド時間(スクリプトがサスペンドを再度有効にするため)と、画面をシャットダウンするまでの時間を設定します。

    #--- set suspend time below (seconds)
    suspend_wait = 300 # = 5 minutes
    #--- set time after which screen should blackout (seconds)
    blackout = 300 # = 5 minutes
    
  4. 必要に応じて、can他の値を設定できます:

    #--- 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. 次のコマンドを使用して、スクリプトをテスト実行します。

    python3 /path/to/no_suspend.py
    
  6. すべてが正常に機能する場合は、スタートアップアプリケーションに追加します:ダッシュ>スタートアップアプリケーション>コマンドを追加します。

    python3 /path/to/no_suspend.py
    
0
Jacob Vlijm