Est-il possible de réveiller un processus interrompu à l'aide de la sleep
commande?
À titre d'exemple, disons que vous avez ce script:
#!/bin/bash
echo "I am tired"
sleep 8h
echo "I am fresh :)"
Après 30 minutes, vous découvrez que vous avez besoin que le script s'arrête, c'est-à-dire que vous souhaitiez avoir écrit à la sleep 30m
place.
Vous ne voulez ni appeler kill PID
ni appuyer sur Ctrl+ C, car la dernière commande n'est pas exécutée et vous resterez fatigué.
Existe-t-il un moyen de réveiller le processus sleep
ou peut-être d'utiliser une autre commande qui prend en charge le réveil? Les solutions aux processus d'arrière-plan et de premier plan sont les bienvenues.
command-line
bash
Bittenus
la source
la source
gawk
ing ne fonctionne pas vraiment. La dernière fois que j'ai eu unsleep
processus d'ing, je l'aipushd
sorti du lit.#!
ligne à votre script . Et que les choses parce que la réponse à votre question dépend de savoir s'il y a une-e
dans la#!
ligne.#!/bin/bash -e
, le script s'arrêtera après une erreur. Le simple fait de tuer la commande sleep sera traité comme une erreur par bash. Cela signifie que sans-e
il existe une réponse assez simple à votre question. S'il a-e
été utilisé, cela devient beaucoup plus difficile, car vous devrez arrêter le processus de sommeil sans le tuer.Réponses:
Lorsqu'un script Bash exécute un
sleep
, voici à quoi celapstree
pourrait ressembler:Les deux ont des ID de processus (PID), même lorsqu'ils s'exécutent en tant que script. Si nous voulions interrompre le sommeil, nous enverrions
kill 8506
et la session Bash reprendrait ... Le problème est dans un environnement scripté, nous ne connaissons pas le PID de lasleep
commande et il n'y a pas d'humain pour regarder le processus arbre.Nous pouvons obtenir le PID de la session Bash via la
$$
variable magique. Si nous pouvons stocker cela quelque part, nous pouvons alors cibler des instancessleep
qui s'exécutent sous ce PID. Voici ce que je mettrais dans le script:Et puis nous pouvons dire
pkill
auxsleep
instances de Nuke qui s'exécutent sous ce PID:Encore une fois, cela se limite aux seuls
sleep
processus s'exécutant directement sous cette seule session Bash. Tant que le PID a été enregistré correctement, cela le rend beaucoup plus sûr quekillall sleep
oupkill sleep
, ce qui pourrait neutraliser toutsleep
processus sur le système (autorisations le permettant).Nous pouvons prouver cette théorie avec l'exemple suivant où nous avons trois sessions bash distinctes, deux en cours d'exécution
sleep
. Seulement parce que nous spécifions le PID de la session bash en haut à gauche, seul sonsleep
est tué.Une autre approche consiste à pousser
sleep
en arrière-plan, à stocker son PID, puis à le remettre au premier plan. Dans le script:Et pour le tuer:
la source
Vous pouvez écrire votre script pour gérer ("intercepter") d'autres signaux provenant de kill, etc. afin de pouvoir modifier le comportement des scripts selon vos besoins. Voir man bash:
la source
Vous pouvez simplement tuer le sommeil qui continuerait jusqu'à la ligne suivante du script:
Notez que cela tuerait tout processus de veille en cours d'exécution dans votre système, pas seulement dans votre script.
la source
J'ai un script bash endormi démarré
cron
au démarrage. Le script se réveille chaque minute et définit la luminosité de l'écran du portable en fonction du lever et du coucher du soleil obtenus sur Internet. Une phase de transition configurable par l'utilisateur entre la pleine luminosité et la pleine luminosité nécessite une augmentation et une diminution des valeurs de 3, 4, 5 ou tout ce qui est calculé toutes les minutes.Oli a brièvement abordé
pstree
sa réponse mais l'a rejetée car cela tuerait tous lessleep
cas. Cela peut être évité en restreignant la recherche à l'aide des options pstree.En utilisant,
pstree -h
nous voyons toute la hiérarchie:Comme vous pouvez le voir, une connexion Ubuntu typique contient de nombreux PID (ID de processus).
Nous pouvons le réduire à notre script en cours d'exécution en utilisant:
Nous voyons:
cron
a démarré un shell (ID de processus 1308 et ID de session 1308)sleep
sous l'ID de processus 26552 et à nouveau l'ID de session 1308À ce stade, nous pouvons utiliser
pkill -s 1308
et cela tuerait la session entière qui comprend le shell, notre programmedisplay-auto-brightness
et lasleep
commande. Au lieu de cela, nous utiliseronskill 26552
uniquement la commande sleep pour forcer notre programme à se réveiller et à régler la luminosité.En tapant cela manuellement dans le terminal, vous voyez:
L'étape suivante consiste à le faire lorsque l'ordinateur portable se réveille de la suspension. Par exemple, lorsque le couvercle était fermé, il faisait noir et la luminosité de l'écran était réglée sur "300". Lorsque le couvercle est ouvert, il fait jour et la luminosité doit être réglée sur "2000". Bien sûr, le programme se réveillerait de lui-même en 1 à 59 secondes, mais il est plus confortable de régler la luminosité instantanément.
Je publierai le code de suspension / reprise après son écriture. Espérons que ce week-end.
la source