web-dev-qa-db-ja.com

ダウンロードの進行中にUbuntuを中断しないようにする方法はありますか?

方法はありますか?

/usr/lib/pm-utils/sleep.dでスクリプトを作成して、${downspeed eth0}${upspeed wlan0}${upspeed eth0}、および${downspeed wlan0}を確認し、ダウンロードの進行中に一時停止しないでシステムをオンにする方法スクリーンオフ?

私のOSはUbuntu 15.04です。

4
dhiya

@ByteCommandersの2番目のコメントに触発されて、以下のスクリプトはあなたが説明することを行います:ダウンロードフォルダーがダウンロード先のディレクトリであると仮定して、ダウンロード中のサスペンドを無効にします、その後、ダウンロードが本当に完了したことを確認するために、サスペンドを再度有効にする前に5分間(設定するのは任意)待機します。
あなたはcanダウンロードフォルダとして監視される他のディレクトリを設定します。

使い方

ループ内(20秒に1回)で、スクリプトは次のコマンドを使用してターゲットフォルダーのサイズを確認します。

du -ks ~/Downloads

スクリプトは、各チェックを最後のチェックと比較して、ダウンロードアクティビティ(サイズの増加)をチェックします。 5分以上アクティビティがない場合(ただし、他の「待機」時間を設定できます)、スクリプトはダウンロードが行われていないと想定し、「通常の」サスペンドが(再)有効になります。

他の方法:スクリプトが~/Downloadsdirectoryのサイズの増加を確認した場合、5分以上アクティビティが検出されなくなるまで、サスペンドを無効にします。

ジュースが少ない

スクリプトのコマンドのリソースは非常に少なくなっています。サイクルは20秒に1回しか実行されないため(そのまま)、プロセッサの負荷は実質的にゼロです。

スクリプト

#!/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. スクリプトのheadセクションで、目的の「通常の」サスペンド時間を設定します(スクリプトがサスペンドを再度有効にするため)。

    #--- set suspend time below (seconds)
    suspend_wait = 300
    #---
    
  3. 必要に応じて、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
    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
Jacob Vlijm

UPDATE(2016-06-11):下に最初にスクリプトを書いて以来、それに基づいて中断するタイミングを決定する本格的なプログラムに成長しました

  1. ネットワークトラフィック
  2. ユーザーアクティビティ
  3. CPU負荷

私はここでLaunchpadにそれを公開しました https://launchpad.net/keep.awake GPLライセンスの下で。

スナップパッケージやデブはまだありませんが、私は最終的にそれに近づきます。それまでの間、 this をダウンロードし、解凍して使用できます。

適切なコマンドのように機能します。
-helpと入力して、実行可能な操作の完全なリストを表示します。下の例はほんの数例です。
./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 &

バックグラウンドサービスとして実行し、最小CPU負荷を13%に設定するには:
Nohup ./keepawake.py -c 13 -r > /dev/null 2>&1 &

バックグラウンドサービスとして実行し、最小ネットワークトラフィックを5KB(5120バイト)に設定するには:
Nohup ./keepawake.py -s 5120 -r > /dev/null 2>&1 &

上記の3つの設定(ネットワーク、CPU、ユーザーアイドル)をすべて一度に実行するには:

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


[オリジナルポスト]

Dhiyaの応答に基づいて、スクリプトを大幅に変更しました。 ネットワークトラフィックANDuser acitvityの両方を処理します!

名前を付けなければならないので、「Keep Awake」と名付けました。

質問やコメントがある場合は、試してから返信してください!

リリースノート...

  1. しきい値に基づいてユーザーアクティビティとネットワークトラフィックの両方をチェックします
  2. いずれかまたは両方がしきい値の制限を超えている場合、OSのサスペンド電源設定は無効になります。
  3. コードの最初の変更によりPython 2.7.xになりました3.4.xに戻す必要がありました
  4. python 3機能を使用して、ログファイルと標準出力の両方に出力される印刷を実装しました。
  5. 状態を判別するために多くのデータ印刷が追加されました。トラブルシューティングに非常に役立ちます。
  6. If-Elif-elseロジックに、カウントダウンカウンターを追加しました。
  7. 多くのコメントを追加しました。できれば、これらすべての新しいものを助けてください。
  8. 出力ログを無期限に管理するために使用できるlogrotate構成をバンドルしました。 (履歴のコメントを参照)
  9. Logrotate cronをcron.hourlyに移動することを強くお勧めします
  10. Xprintidleを利用します
  11. logrotate configはxz-utilsを利用します
  12. 繰り返し行われたパフォーマンステストでは、CPUへの影響はほとんど無視できることが示されています。 logrotateで実行されるxz圧縮アルゴリズムのみが、シングルコアに最大100%影響を与えます。しかし、それは現代のCPUでは長続きせず、シングルスレッドです。したがって、他のコアが他の作業を実行できます。数日前または20MBを超えるログのみを圧縮します。
  13. 構成に満足したら、アカウントへのログイン時にプログラムを起動するディストリビューションのビルトインスタートアップアプリケーションランチャーを使用してセットアップできます。ログファイルを管理するために、logrotateがその下のスクリプト構成で構成されていることを確認してください。あなたもあなたの喜びにそれを微調整することができます。
  14. 16/09/2015-バージョン2.1-Force Graceful Suspensionロジックを追加
  15. 16/09/2015-バージョン2.1-プログラムはSudo特権で実行され、/ var/log/Keep.Awake /にログを記録するようになりました。 logrotate configは、デフォルトで圧縮用のマルチコア処理になり、1Mを超える場合にのみ回転します。これにはxz-utils> = v5.2.0が必要です

バックグラウンドで実行するサンプルコマンド

    $ Sudo Nohup python3 Keep\ Awake.v2.py > /dev/null 2>&1 &

ファイル名: "Keep\Awake.v2.py"

    #!/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 __== '__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」を使用してください。非常に便利です!...FILENAME: "Keep.Awake.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
DanglingPointer

提供された回答に基づいて here 、アップロードまたはダウンロードの進行中にUbuntuが中断しないように、@ Jacob Vlijmの script を次のように変更しました。最初に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 __== '__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
dhiya