Si j'exécute un long processus, est-il possible d'exécuter des commandes temporelles?
Par exemple, j'exécute un processus très long qui dure environ 10 minutes.
Après 5 minutes, je voudrais exécuter une commande distincte. À titre d'illustration, la commande distincte pourrait être:echo 5 minutes complete
(Remarque: je ne veux pas de progrès vers l'achèvement de la commande, mais simplement des commandes exécutées après des intervalles spécifiés.)
C'est possible?
shell-script
shell
delay
Aniket Bhattacharyea
la source
la source
longcommand & sleep 300 && command-to-do-after-five-minutes
? (En fait, c'est probablement ce que vous recherchez.) Notez que votre clarification n'était pas suffisante, car vous avez obtenu deux implémentations de barre de progression d'horloge dès le départ.Réponses:
Exécutez simplement:
Le
do-this-after-five-minutes
sera exécuté après cinq minutes. Lelong-command
sera exécuté en arrière-plan.la source
sleep 5m && foobar
, donc si je change d'avis et ^ C lasleep
, la commande suivante ne s'exécute pas.sleep 3; ls
et^C
, la deuxième commande ne s'exécute pas de toute façon. Vous ne savez pas vraiment pourquoi et cela fonctionne peut-être différemment dans un shell non interactif?sleep 5m && echo
dormez, lorsque vous suspendez, seule lasleep
commande est suspendue. Le reste de la ligne de commande s'exécute, mais depuis qu'il asleep
été suspendu, il ne s'est pas terminé avec succès et la partie suivante&&
est ignorée. Essayez de suspendresleep 5 || echo hello
ethello
s'affiche directement après avoir appuyé sur^Z
.at(1)
, pour des choses comme lesleep 30m && mplayer something.mp3
rappel d'alarme ou poursleep 90m && fg
reprendre une commande gourmande en disque plus tard. Donc, en fait,sleep 5m && echo hello
c'est bien parce que^Z
suspendsleep
sans exécuter la commande suivante du tout. Si vous souhaitez pouvoir suspendre / reprendre l'intégralité de la commande composée, avant même la fin du sommeil, utilisez( sleep 2 && echo hello )
.&&
idiome vous permet d'être absolument sûr de ne pas tuer le processus juste après la mise en veille (car vous pouvez^Z
ne pas exécuter la commande, au lieu de risquer a^C
). Ceci est utile dans le cas d'utilisationsleep && fg
ousleep && bg
, lorsque la commande reprise reprend à mi-chemin quelque chose de lent.Vous pouvez utiliser ce script:
Il exécute votre fichier
longprocess
dans unsub-shell
, puis surveille l'existence du fichier de «verrouillage» créé précédemment.la source
man bash
pourSECONDS
. Vous pouvez définirSECONDS=0
au démarrage du script et ne vérifier que supérieur ou égal à 300 ou définirSECONDS=$((date +%s))
et oublier d'utiliser àdate
nouveau dans votre script ...sleep 1s
toujours été exactement une seconde plus tard qu'auparavantsleep 1s
... alors vous avez été victime de faussetés que les programmeurs croient au temps . (Bien que dans ce cas, vous pourriez tout aussi bien afficher une barre de progression de marque de hachage ou quelque chose comme ça.)sleep
du tout!SECONDS
! :)Il y a une doublure pour cela:
Dans votre cas TIMEOUT = 5m et COMMAND est la commande longue.
Voir également ma réponse à ce message Délai d'attente avec «redémarrage du réseau de service»
la source
jobs %1
échoue une fois le travail% 1 arrêté.Notez que pour des temps plus longs, $ secondes peuvent se désynchroniser avec le temps réel. Il est préférable de stocker l'heure de début et de calculer la différence avec l'heure réelle.
la source