web-dev-qa-db-fra.com

Empêcher la suspension avant la fin de l'exécution de la commande à partir du terminal

Récemment, j'ai exécuté un script long que j'ai démarré à partir d'une fenêtre de terminal dans Ubuntu 16.04 x64. Lorsque je me suis éloigné du système, celui-ci a été automatiquement suspendu après les 20 minutes de configuration définies dans la fenêtre System Settings, ce qui a eu pour effet de suspendre le script. Lorsque je suis revenu dans le système, je me suis rendu compte que plusieurs heures de progrès dans l'exécution de mon script avaient été perdues car le système avait été suspendu.

Une solution de contournement consiste à sélectionner manuellement Don't suspend dans la fenêtre de réglages Power choisie dans System Settings. Cette méthode pour empêcher la suspension n'est pas satisfaisante (1) car j'oublie souvent de le faire, et (2) parce qu'elle me soumet à mon système.

Peut-être y a-t-il une manière plus simple mais toujours manuelle de faire cela avec une sorte de commande de préfixe, que j'appellerai nosuspend pour le moment, avec cet usage: nosuspend python myscript.py arg1 arg2. Mon principal reproche à cette commande mythique est qu’elle nécessite toujours que je me souvienne de l’utiliser, et, comme il est déraisonnable de préfixer toutes les commandes de terminal, il faut prédire si un script prendra 1 minute ou 1 heure, et cette prédiction peut être incorrect, entraînant à nouveau une perte de temps et une frustration.

Idéalement, la solution empêcherait la suspension tant que toutes les commandes exécutées à partir d'une fenêtre de terminal ne sont pas complètes. À un certain niveau, je réalise que cela est impossible, puisqu’un processus bash dans la fenêtre de terminal peut avoir un sous-processus que nous ne voulons peut-être pas empêcher de dormir, par exemple, Sudo su exécuté dans une fenêtre de terminal est toujours en cours de peut ne pas l'utiliser actuellement et est donc inactif, mais nous souhaitons toujours que le système suspende automatiquement après 20 minutes, par exemple. Il existe donc un problème de définition des critères de suspension.

Je dois noter que le script Python en question ne comportait que des disques sporadiques, un réseau et pratiquement aucun processeur, car il avait répété des appels Python time.sleep () d'un nombre inférieur à une minute par appel. Par conséquent, je ne cherche pas particulièrement des méthodes qui détectent simplement un état de repos "relativement" sur le disque, le réseau ou le processeur. Peut-être y a-t-il un moyen de détecter si une commande qui est un sous-processus de Terminal a progressé du tout pendant un intervalle (espérons que le même intervalle soit configuré dans Power ci-dessus) . Espérons que cela distinguerait mon script du contre-exemple inactif Sudo su ci-dessus.

Mise à jour 1 (14-septembre-2016):

Comme recommandé par Adrine Correya ci-dessous, j'ai essayé systemd-inhibit, qui ressemble à l'imaginaire nosuspend ci-dessus, mais cela n'a pas fonctionné. Voici ce que j'ai fait. J'ai d'abord créé un script de test Python appelé "long-job.py":

#!/usr/bin/python3
import time
print("starting")
for i in range(10):
  time.sleep(10)
  print("Epoch", i)
print("all done")

Ensuite, je l'ai rendu exécutable avec chmod +x long-job.py. Pour accélérer les tests, je règle org>gnome>settings-daemon>plugins>power>sleep-inactive-ac-timeout sur 20 (secondes) à l'aide de dconf-editor (installé via le logiciel Ubuntu). J'ai ensuite exécuté le script, sans racine/Sudo, en utilisant systemd-inhibit ./long-job.py, mais le système s'est tout de même mis en veille avant la fin du travail (son exécution devrait prendre environ 100 secondes, mais la mise en veille est intervenue après 20 secondes). J'ai aussi essayé quelques-unes des options (--what="sleep" et --what="idle") mais cela ne fonctionnait toujours pas. Selon la page de manuel, la valeur par défaut est --what="idle:sleep:shutdown".

Mise à jour 2 (14-septembre-2016):

Sur Mac OS X, il semble que caffeinate implémente réellement l’idée nosuspend ci-dessus; voir https://superuser.com/questions/99247/stop-a-mac-from-sleeping-while-a-bash-script-is-running-then-allow-it-to-sleep =. Encore une fois, il serait agréable d’automatiser cette opération, de sorte que nous n’avons pas à deviner quels emplois pourraient durer longtemps. De plus, une version Ubuntu est nécessaire.

1
Dr. Jonas August

Je ne suis pas sûr, mais avez-vous essayé systemd-inhibit? Cela fonctionne sur les machines Linux fonctionnant sur systemd (Ubuntu 16.04 étant l'une d'entre elles, autant que je sache).

Regardez les pages de manuel, man systemd-inhibit pour obtenir de l'aide.

3
Adrine Correya

J'ai écrit un programme keepawake.py qui peut surveiller l'activité du processeur, le trafic réseau et l'activité des utilisateurs (souris/clavier). Cela peut résoudre votre problème. Je l'ai posté ici sur AskUbuntu ...

Y a-t-il un moyen de faire en sorte qu'Ubuntu ne suspende pas pendant qu'un téléchargement est en cours?

Si votre script de longue durée génère du trafic sur le réseau ou déclenche un certain pourcentage d'activité du processeur, le programme ci-dessus peut résoudre votre problème.

0
DanglingPointer