Solution 1 :
Candidat pour le plus créatif abus d'une commande Linux :
nohup watch -n 30 --precise yourprog >/dev/null &
Si yourprog se compose de :
date +%M.%S.%N >> yourprog.out
puis yourprog.out pourrait ressembler à :
50.51.857291267
51.21.840818353
51.51.840910204
52.21.840513307
52.51.842455224
53.21.841195858
53.51.841407587
54.21.840629676
indiquant un assez bon niveau de précision.
Voici une explication des parties de la commande :
nohup- Cela garde la commande qui le suit,watchdans ce cas, de quitter lorsque le terminal quitte.watch- Ce programme exécute une commande à plusieurs reprises. Normalement, le premier écran de sortie de la commande est affiché à chaque foiswatchexécute la commande.-n 30- L'intervalle auquel exécuter la commande. Dans ce cas, c'est toutes les trente secondes.--precise- Sans cette option,watchexécute la commande après intervalle secondes. Avec lui, chaque démarrage de la commande commence sur l'intervalle si possible. Si cette option n'était pas spécifiée dans l'exemple, les temps seraient de plus en plus tardifs de plus de 30 secondes à chaque fois en raison du temps nécessaire pour lancer et exécuter la commande (yourprog).yourprog- Le programme ou la ligne de commande pourwatchéxécuter. Si la ligne de commande contient des caractères spéciaux pour le shell (par exemple, espace ou point-virgule), il faudra les mettre entre guillemets.>/dev/null- Le supérieur à redirige la sortie de la commande exécutée parwatchdans un fichier,/dev/null. Ce fichier supprime toutes les données qui y sont écrites. Cela empêche la sortie d'être écrite à l'écran ou, depuisnohupest utilisé, il empêche l'envoi de la sortie vers un fichier appelénohup.out.&- Lewatchla commande est exécutée en arrière-plan et le contrôle est rendu au terminal ou au processus parent.
Notez que nohup , la redirection de sortie et le & l'opérateur de contrôle en arrière-plan n'est pas spécifique à watch .
Voici une explication de l'exemple yourprog script :
date- Affiche la date et/ou l'heure actuelle. Il peut également les définir.+%M.%S.%N- Cela spécifie le format de sortie pourdateutiliser.%Mest la minute actuelle,%Sest la seconde actuelle et%Nest la nanoseconde actuelle.>> yourprog.out- Cela redirige la sortie dudatecommande dans un fichier appeléyourprog.out. Le double supérieur à entraîne l'ajout de la sortie au fichier à chaque appel plutôt que le contenu précédent en cours d'écrasement.
Modifier :
Peut-être une autre chose qui pourrait être abusée (ou peut-être que c'est une utilisation légitime) est les minuteries systemd.
Voir systemd/Timers en remplacement de cron et Cron vs systemd timers.
J'essaierai de poster un exemple bientôt.
Solution 2 :
Si votre tâche doit être exécutée fréquemment, cron n'est pas le bon outil. Outre le fait qu'il ne lancera tout simplement pas les tâches aussi fréquemment, vous risquez également de graves problèmes si la tâche prend plus de temps à s'exécuter que l'intervalle entre les lancements. Réécrivez votre tâche pour la démoniser et l'exécuter de manière persistante, puis lancez-la à partir de cron si nécessaire (tout en vous assurant qu'elle ne se relancera pas si elle est déjà en cours d'exécution).
Solution 3 :
Cron est conçu pour se réveiller à chaque minute, il n'est donc pas possible de le faire sans un peu de piratage, par exemple dormir comme vous l'avez mentionné.
Solution 4 :
* * * * * /path/to/program
* * * * * sleep 30; /path/to/program
N'oubliez pas d'écrire quelque chose dans votre programme pour qu'il se ferme si une instance précédente est déjà en cours d'exécution.
#!/bin/sh
if ln -s "pid=$$" /var/pid/myscript.pid; then
trap "rm /var/pid/myscript.pid" 0 1 2 3 15
else
echo "Already running, or stale lockfile." >&2
exit 1
fi
Bien sûr, cela laisse encore une très petite possibilité d'échec, alors recherchez sur Google une meilleure solution applicable à votre environnement.
Solution 5 :
Vous pouvez le faire avec un logiciel tiers.
Une option qui a bien fonctionné pour moi est frequent-cron
Il permet une précision à la milliseconde et vous donne la possibilité de différer l'exécution suivante jusqu'à ce que l'exécution en cours soit terminée..