Si la command reach timeout exécute une autre command

J'essaie de mettre en place un script pour l'ordinateur de mon école qui les éteint automatiquement à la fin de la journée (puisque la plupart des enseignants les ont oubliés).

J'ai pensé à envoyer une boîte d'avertissement zenify pour informer l'user que le PC va s'éteindre et, si l'user ne confirme pas dans 1 minute, le PC s'arrête.

Je connais l'existence de la command timeout, mais dans ce cas, je veux appeler sudo shutdown -h now si la command zenity ne returnne pas dans les 60 secondes.

J'essayais de faire quelque chose comme

timeout 60 --onTimeout="sudo shutdown -h now" zenity --warning --text="This PC is going to shut down in a minute if you DO NOT press the OK button."

La command serait exécutée dans un script cron.

Donc, la question est : Comment puis-je exécuter une command lorsque le programme zenity timeout?

Vous devrez vérifier le statut de sortie et prendre une décision en fonction de cela. Le manuel pour le timeout GNU dit que

Si la command expire et que –preserve-status n'est pas défini, quittez avec le statut 124.

Donc, dans un script shell, vous feriez quelque chose comme ça:

 timeout 60 zenity ... if [ $? = 124 ] ; then echo it timed out, do something... else echo didn't time out fi 

Bien que, il semble que zenity supporte un timeout en lui – même , donc vous n'avez pas besoin d'un timeout d'attente externe:

 zenity --timeout 60 --warning --text="Shutdown in 60" if [ $? = 5 ] ; then sudo shutdown -h now fi 

Même si vous utilisez le propre timeout d'attente de Zenity, il ne semble pas montrer le time restant. Cependant, il a un mode de barre de progression qui pourrait être utilisé pour transmettre un sentiment de catastrophe imminente. Quelque chose comme ça afficherait un count à rebours de 60 avec une barre de progression remplissant en même time:

 #!/bin/bash timeout=60 for (( i=0 ; i <= $timeout ; i++ )) do echo "# Shutdown in $[ $timeout - $i ]..." echo $[ 100 * $i / $timeout ] sleep 1 done | zenity --progress --title="Shutting down automatically..." \ --window-icon=warning --width=400 --auto-close if [ $? = 0 ] ; then echo timeout passed else echo cancel was pressed or zenity failed somehow fi