J'ai trouvé plusieurs questions à ce sujet, mais je n'arrive pas à en trouver une qui réponde à mes besoins.
J'aimerais que ma machine (Xubuntu 16.04) s'éteigne si je ne l'utilise pas pendant 30 minutes. Cependant, je l'utilise pour diffuser des vidéos sur mon centre multimédia (via un serveur SAMBA), je ne souhaite donc pas qu'il s'éteigne dans ce cas.
Toutes les réponses que j'ai trouvées ignorent l'activité du réseau et se concentrent uniquement sur les frappes au clavier et les déplacements de la souris.
J'ai mis en place mon propre travail cron pour gérer cela.
Suspendre/arrêter la machine si celle-ci est inactive (aucune frappe ni déplacement de souris) pendant un certain temps, à moins que des fichiers ne soient en cours d'accès sur son serveur SAMBA.
root
accès.xprintidle
(installez-le en l'exécutant dans un terminal: Sudo apt-get install xprintidle
)Enregistrez le script suivant à l'emplacement de votre choix (dans mon cas, /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
Sachez que ce script sera exécuté par cron
. Cela a certaines implications, mais principalement le fait que les variables d'environnement DISPLAY
et PATH
ne sont pas définies. Par conséquent, nous devons donner le chemin complet lors de l'appel d'une commande. Les chemins d'accès pouvant changer sur votre ordinateur, assurez-vous qu'ils correspondent à votre configuration (par exemple, pour rechercher le chemin d'accès de xprintidle
à l'exécution dans un terminal which xprintidle
).
Nous devons également spécifier l’AFFICHAGE pour lequel nous voulons les informations xprintidle
. C'est normalement :0.0
, mais vous pouvez en être sûr en exécutant w
à partir d'un terminal tout en étant connecté et en vérifiant la colonne FROM
. Lisez ces trois liens ( 1 , 2 et ) pour plus d'informations sur PATH
et DISPLAY
sous cron
.
Assurez-vous de le rendre exécutable:
chmod + x /home/user/.useful-scripts/idle.sh
Configurez l’exécution périodique du travail à l’aide de cron
. smbstatus
doit être exécuté en tant que root
, nous devons donc appeler crontab
à l'aide de Sudo
:
Sudo crontab -e
Ajoutez la ligne suivante pour exécuter le script périodiquement:
* * * * * /home/user/.useful-scripts/idle.sh
Ceci configure un travail cron pour qu'il s'exécute chaque minute et exécute notre script. Vous pouvez définir la périodicité sur une valeur plus élevée si vous ne vous souciez pas de la précision (voir ce lien pour plus d'informations sur la syntaxe nécessaire).
Ça y est. cron
vérifie l'état d'inactivité de la machine toutes les minutes. S'il est inactif depuis plus de 20 minutes (peut être ajusté avec la variable IDLE_LIMIT_MS
), il s'assurera qu'aucun fichier n'est en cours d'accès via le serveur SAMBA. ; dans ce cas, la machine sera suspendue.
Vous pouvez exécuter le script d'arrière-plan (très faible en jus), qui suspendra l'ordinateur, arrondi sur 10 secondes:
#!/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
). S'il dépasse un certain montant, le "compteur" est mis à zéro, sinon a0 secondes sont ajoutées au temps "flux".xprintidle
Si les deux dépassent la durée définie (en tête du script), l'ordinateur est mis en veille.
Le script a besoin de xprintidle
Sudo apt-get xprintidle
Copiez le script dans un fichier vide, enregistrez-le sous le nom set_idle.py
Testez-le avec la commande:
python3 /path/to/set_idle.py
Si tout fonctionne bien, ajoutez-le aux applications de démarrage.
Cette réponse suppose que le trafic se fait via une connexion Ethernet. Sinon, la fonction get_packets()
nécessite éventuellement une petite édition.