web-dev-qa-db-ja.com

アイドル後のシャットダウン(ただし、SAMBAサーバーが使用中の場合はシャットダウンしない)

これについていくつかの質問を見つけましたが、自分のニーズに合った質問を見つけることができないようです。

30分間使用しない場合は、マシン(Xubuntu 16.04)の電源をオフにしてください。ただし、(SAMBAサーバーを介して)ビデオをメディアセンターにストリーミングするために使用するため、その場合はシャットダウンしないでください。

私が見つけたすべての答えは、ネットワークアクティビティを無視し、キーストロークとマウスの動きのみに焦点を当てています。

1
user2891462

これに対処するために、独自のcronジョブをセットアップしました。

私が達成したこと

SAMBAサーバーでアクセスされているファイルがない限り、マシンが一定時間アイドル状態(キーストロークやマウスの移動なし)であった場合、マシンをサスペンド/シャットダウンします。

要件

  • rootアクセス。
  • xprintidle(ターミナルで実行してインストールします:Sudo apt-get install xprintidle

方法

  1. 次のスクリプトを任意の場所に保存します(私の場合、/home/user/.useful-scripts/idle.sh):

    #!/bin/bash
    
    # Checks the time the computer has been idle (no keystrokes or mouse moves)
    # If it's greater than the set limit, it will suspend the machine if no
    # files are being accessed through the SAMBA server.
    
    
    # The maximum number of milliseconds the computer is allowed to be idle before
    # it is suspended (set to 20 minutes)
    IDLE_LIMIT_MS=1200000
    
    # How long the machine has been idle for
    IDLE_TIME_MS=$(/sbin/runuser -l ic -c "DISPLAY=:0.0 /usr/bin/xprintidle")
    
    if [ $IDLE_TIME_MS -gt $IDLE_LIMIT_MS ] ;
    then
        # If there are no files locked by SAMBA, suspend the machine
        FILES_LOCKED=$(/usr/bin/smbstatus | /bin/grep 'Locked files:')
    
        if [[ -z "${FILES_LOCKED}" ]] ;
        then
            /bin/systemctl suspend -i
            # If you prefer to shut down instead of suspend, comment the
            # previous line and uncomment the following one:
            # /sbin/poweroff
        fi
    fi
    

    このスクリプトはcronによって実行されることに注意してください。これには特定の意味がありますが、主にDISPLAYおよびPATH環境変数が設定されていないことです。したがって、コマンドを呼び出すときにフルパスを指定する必要があります。マシン内でパスが変更される可能性があるため、設定と一致することを確認してください(たとえば、xprintidleのパスを見つけるには、ターミナルwhich xprintidle)。

    xprintidleinformationが必要なDISPLAYも指定する必要があります。通常は:0.0が、ログイン中に端末からwを実行し、FROM列をチェックすることで確認できます。 PATHおよびDISPLAYの詳細については、これら3つのリンク( 12 および)を参照してください。 cron

  2. 必ず実行可能にしてください:

    chmod + x /home/user/.useful-scripts/idle.sh

  3. cron を使用して定期的に実行するようにジョブを設定します。 smbstatusrootとして実行する必要があるため、crontabを使用してSudoを呼び出す必要があります。

    Sudo crontab -e

    次の行を追加して、スクリプトを定期的に実行します。

    * * * * * /home/user/.useful-scripts/idle.sh

    これにより、cronジョブが1分ごとに実行され、スクリプトが実行されるように設定されます。精度を小さくする必要がない場合は、周期性をより高い値に設定できます(必要な構文の詳細については、 このリンク を参照してください)。

これだよ。 cronはマシンのアイドル状態を1分ごとにチェックし、20分以上アイドル状態になっている場合(IDLE_LIMIT_MS変数)SAMBAサーバーを介してファイルにアクセスしていないことを確認します。その場合、マシンを一時停止します。

1
user2891462

(ジュースが非常に少ない)バックグラウンドスクリプトを実行して、コンピューターを一時停止します(10秒単位で丸めます)。

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

# --- set idle time below (seconds)
idle_set = 1200
# ---

def get_packets():
    return int([l.strip().split()[1].replace("packets:", "") for l in \
            subprocess.check_output("ifconfig").decode("utf-8").splitlines()\
            if " RX " in l][0])

def get_idle():
    return int(int(subprocess.check_output("xprintidle").decode("utf-8").strip())/1000)

data1 = get_packets()
t = 0

while True:
    time.sleep(10)
    data2 = get_packets()
    if data2 - data1 > 3000:
        t = 0
    else:
        t += 10
    idletime = get_idle()
    if all([idletime > idle_set, t > idle_set]):
        subprocess.Popen(["systemctl", "suspend", "-i"])
    data1 = data2
_

何をする

  • 10秒ごとに1回、現在の受信データ量をチェックし、10秒前と比較します(ifconfigを使用)。特定の量を超える場合、「カウンター」はゼロに設定されます。それ以外の場合は、「ストリーム」アイドル時間に0秒が追加されます。
  • また、10秒に1回、xprintidleを使用して「一般的な」アイドル時間を調べます。

両方が設定時間(スクリプトの先頭)を超えると、コンピューターはスリープ状態になります。

設定方法

  1. スクリプトにはxprintidleが必要です

    _Sudo apt-get xprintidle
    _
  2. スクリプトを空のファイルにコピーし、_set_idle.py_として保存します

  3. スクリプトのヘッドセクションで、目的のアイドル時間を設定します
  4. コマンドでテスト-rfun:

    _python3 /path/to/set_idle.py
    _

すべてが正常に機能する場合は、スタートアップアプリケーションに追加します。

注意

この回答は、トラフィックがイーサネット接続を経由していることを前提としています。そうでない場合、関数get_packets()はおそらく小さな編集を必要とします。

1
Jacob Vlijm