これについていくつかの質問を見つけましたが、自分のニーズに合った質問を見つけることができないようです。
30分間使用しない場合は、マシン(Xubuntu 16.04)の電源をオフにしてください。ただし、(SAMBAサーバーを介して)ビデオをメディアセンターにストリーミングするために使用するため、その場合はシャットダウンしないでください。
私が見つけたすべての答えは、ネットワークアクティビティを無視し、キーストロークとマウスの動きのみに焦点を当てています。
これに対処するために、独自のcronジョブをセットアップしました。
SAMBAサーバーでアクセスされているファイルがない限り、マシンが一定時間アイドル状態(キーストロークやマウスの移動なし)であった場合、マシンをサスペンド/シャットダウンします。
root
アクセス。xprintidle
(ターミナルで実行してインストールします:Sudo apt-get install xprintidle
)次のスクリプトを任意の場所に保存します(私の場合、/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
)。
xprintidle
informationが必要なDISPLAYも指定する必要があります。通常は:0.0
が、ログイン中に端末からw
を実行し、FROM
列をチェックすることで確認できます。 PATH
およびDISPLAY
の詳細については、これら3つのリンク( 1 、 2 および)を参照してください。 cron
。
必ず実行可能にしてください:
chmod + x /home/user/.useful-scripts/idle.sh
cron
を使用して定期的に実行するようにジョブを設定します。 smbstatus
はroot
として実行する必要があるため、crontab
を使用してSudo
を呼び出す必要があります。
Sudo crontab -e
次の行を追加して、スクリプトを定期的に実行します。
* * * * * /home/user/.useful-scripts/idle.sh
これにより、cronジョブが1分ごとに実行され、スクリプトが実行されるように設定されます。精度を小さくする必要がない場合は、周期性をより高い値に設定できます(必要な構文の詳細については、 このリンク を参照してください)。
これだよ。 cron
はマシンのアイドル状態を1分ごとにチェックし、20分以上アイドル状態になっている場合(IDLE_LIMIT_MS
変数)SAMBAサーバーを介してファイルにアクセスしていないことを確認します。その場合、マシンを一時停止します。
(ジュースが非常に少ない)バックグラウンドスクリプトを実行して、コンピューターを一時停止します(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
_
ifconfig
を使用)。特定の量を超える場合、「カウンター」はゼロに設定されます。それ以外の場合は、「ストリーム」アイドル時間に0秒が追加されます。xprintidle
を使用して「一般的な」アイドル時間を調べます。両方が設定時間(スクリプトの先頭)を超えると、コンピューターはスリープ状態になります。
スクリプトにはxprintidle
が必要です
_Sudo apt-get xprintidle
_
スクリプトを空のファイルにコピーし、_set_idle.py
_として保存します
コマンドでテスト-rfun:
_python3 /path/to/set_idle.py
_
すべてが正常に機能する場合は、スタートアップアプリケーションに追加します。
この回答は、トラフィックがイーサネット接続を経由していることを前提としています。そうでない場合、関数get_packets()
はおそらく小さな編集を必要とします。