web-dev-qa-db-fra.com

Arrêt après une période d'inactivité (sauf si le serveur SAMBA est en cours d'utilisation)

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.

1
user2891462

J'ai mis en place mon propre travail cron pour gérer cela.

Ce que j'ai réalisé

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.

Conditions requises

  • root accès.
  • xprintidle (installez-le en l'exécutant dans un terminal: Sudo apt-get install xprintidle)

Comment

  1. 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.

  2. Assurez-vous de le rendre exécutable:

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

  3. 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.

1
user2891462

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

Ce qu'il fait

  • Une fois toutes les 10 secondes, il vérifie la quantité de données en cours reçue, en la comparant à il y a 10 secondes (à l'aide de ifconfig). S'il dépasse un certain montant, le "compteur" est mis à zéro, sinon a0 secondes sont ajoutées au temps "flux".
  • De plus, une fois toutes les 10 secondes, il regarde le temps d'inactivité "général", en utilisant xprintidle

Si les deux dépassent la durée définie (en tête du script), l'ordinateur est mis en veille.

Comment mettre en place

  1. Le script a besoin de xprintidle

    Sudo apt-get xprintidle
    
  2. Copiez le script dans un fichier vide, enregistrez-le sous le nom set_idle.py

  3. Dans la section head du script, définissez la durée d'inactivité souhaitée.
  4. Testez-le avec la commande:

    python3 /path/to/set_idle.py
    

Si tout fonctionne bien, ajoutez-le aux applications de démarrage.

Remarque

Cette réponse suppose que le trafic se fait via une connexion Ethernet. Sinon, la fonction get_packets() nécessite éventuellement une petite édition.

1
Jacob Vlijm