web-dev-qa-db-fra.com

Exécuter la commande après un certain laps de temps?

Si j'exécute un long processus, existe-t-il un moyen 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. Par exemple, 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?

27

Exécutez simplement:

long-command & sleep 300; do-this-after-five-minutes

Le do-this-after-five-minutes s'exécutera après cinq minutes. Le long-command s'exécutera en arrière-plan.

34
Wildcard

Vous pouvez utiliser ce script:

#!/bin/bash

TEMPFILE="$(mktemp)"
STARTTIME="$(date +%s)"
(./longprocess; rm -f "$TEMPFILE") &
while [ -f "$TEMPFILE" ]; do
    sleep 1s
    NOW="$(date +%s)"
    if (( (NOW-STARTTIME) % 300 == 0 )); then
        echo "$(( (NOW-STARTTIME)/60 )) minute(s) elapsed"
    fi
done
echo "Done!!!"

Il exécute votre longprocess dans un sub-Shell, puis surveille l'existence du fichier "verrou" créé précédemment.

5
Serge

Il y a une doublure pour cela:

( ( sleep $TIMEOUT ; echo "5 minutes complete") & $COMMAND )

Dans votre cas TIMEOUT = 5m et COMMAND est la commande longue.

Voir également ma réponse à cet article Délai d'attente avec "redémarrage du réseau de service"

4
coffeMug
#! /bin/bash

( sleep 4 ) & # <-- The long running process.

seconds=1
while jobs %1 &>/dev/null ; do
    echo $((seconds++)) seconds complete
    sleep 1    
done
echo Done.

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.

3
choroba