Empêcher la machine de dormir lorsque les connexions SSH sont activées

13

J'essaie d'économiser de l'énergie en basculant les bureaux en mode suspension lorsqu'ils sont inactifs. Mais de nombreux bureaux sont également accessibles via SSH par leurs propriétaires. Une solution wakeonlan est déployée pour permettre aux propriétaires d'allumer la machine, mais le problème est que les machines se suspendent à nouveau automatiquement dans 10 minutes, même si la connexion SSH est activée.

Ce que j'essaie de faire, c'est d'inclure les sessions SSH actives dans les définitions "d'activité".

La question est de savoir si cela peut être fait en définissant une règle polkit? Cela peut-il être fait en mettant un script qui s'exécute avant la suspension réelle et l'abandonne si des sessions SSH sont trouvées? J'ai besoin d'une manière propre et légitime de le faire. Si ce n'est pas le cas, les méthodes hacky sont également les bienvenues.

Solution de piratage naïf actuelle: modifier /usr/sbin/pm-suspend:

#check for SSH sessions, and prevent suspending:
if [ "$(who | grep -cv "(:")" -gt 0 ]; then
    echo "SSH session(s) are on. Not suspending."
    exit 1
fi

Cela sert le but. Mais je ne sais pas quand une mise à jour écrasera le fichier /usr/sbin/pm-suspend. Je ne sais pas non plus comment cela fonctionnera avec d'autres implémentations suspendues comme tuxonice.

Bhavin Doshi
la source
2
Puis-je suggérer d'utiliser grep -cv :0au lieu de passer wc?
terdon
1
Une autre idée pour plus d'élégance: vous pouvez supprimer l'invocation de [si vous écrivez if who | grep -qv :0; then(en supposant que vous avez un POSIX conforme grepcomme GNU grep).
David Foerster

Réponses:

19

Jusqu'à Ubuntu 14.10 (basé sur Upstart)

Jetez un œil pm-action(8)et recherchez /etc/pm/sleep.ddans la section «FICHIERS». Si l'un de ces scripts revient avec un état de sortie différent de zéro, la suspension est empêchée.

Instructions mises à jour pour plus de clarté:

  1. Créez donc un fichier /etc/pm/sleep.d/05_ssh_keepawake.

  2. Mettez un shebang ( #!/bin/sh) et le code mentionné dans la question dans ce fichier.

  3. Définissez les autorisations d'exécution sur celui-ci:

    chmod +x /etc/pm/sleep.d/05_ssh_keepawake
    

Depuis Ubuntu 15.04 (basé sur systemd)

systemd n'utilise pas pm-utils pour gérer ses hooks d'état d'alimentation mais dispose de sa propre infrastructure à la même fin. Les vérificateurs d'inhibiteur de sommeil ne sont plus exécutés en mode veille, mais doivent être définis par l'action qui inhibe le sommeil (voir 1 ).

En tant que tel, vous devez ajouter des commandes à la connexion et à la déconnexion de session SSH qui enregistrent un inhibiteur de sommeil avec systemd (par exemple via systemd-inhibit(1)) et libèrent plus tard l'inhibiteur. Si quelqu'un sait comment se connecter et se déconnecter de SSH, j'accueillerais un commentaire ou une modification afin que nous puissions déterminer les étapes et les commandes pertinentes.

La section suivante est en cours de réalisation - Utilisez-la uniquement lorsque vous savez ce que vous faites!

Vous pourrez peut-être écrire une unité systemd /etc/systemd/system/ssh-inhibt-sleep.servicequi se rend dépendante de l' sleep.targetutilisation de l' RequiredByoption. Si votre nouvelle unité échoue (avec un état de sortie non nul de son processus invoqué), elle effectuera sleep.targetet donc l'action de sommeil suivante.

[Unit]
Description=Check for running SSH sessions and, if any, inhibit sleep
Before=sleep.target

[Service]
Type=oneshot
ExecStart=/bin/sh -c '! who | grep -qv :0'`

[Install]
RequiredBy=sleep.target

Comme toujours, vous devez activer les unités systemd pour qu'elles prennent effet:

sudo systemctl enable ssh-inhibt-sleep.service

Pour plus d'informations, voir systemd.unit(5)et systemd.service(5).

David Foerster
la source
cela ne semble pas fonctionner en 18.04. N'est-ce plus la solution?
Michael Jarret
1
@MichaelJarret: En effet. J'ai mis à jour ma question avec quelques informations sur la situation avec systemd.
David Foerster
J'ai trouvé ce qui suit en essayant de résoudre ce problème hier, mais je n'ai pas pu modifier le script précédent pour faire le travail ici
Michael Jarret
Je ne peux pas modifier mon commentaire, mais cela semble également pertinent
Michael Jarret
1
@MichaelJarret: J'ai eu une autre idée que vous pourriez essayer. Voir la mise à jour de ma réponse.
David Foerster