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,watch
dans 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 foiswatch
exé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,watch
exé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 parwatch
dans 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, depuisnohup
est utilisé, il empêche l'envoi de la sortie vers un fichier appelénohup.out
.&
- Lewatch
la 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 pourdate
utiliser.%M
est la minute actuelle,%S
est la seconde actuelle et%N
est la nanoseconde actuelle.>> yourprog.out
- Cela redirige la sortie dudate
commande 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..