Řešení 1:
Kandidát na nejkreativnější zneužití příkazu Linux:
nohup watch -n 30 --precise yourprog >/dev/null &
Pokud yourprog
sestává z:
date +%M.%S.%N >> yourprog.out
pak yourprog.out
může vypadat takto:
50.51.857291267
51.21.840818353
51.51.840910204
52.21.840513307
52.51.842455224
53.21.841195858
53.51.841407587
54.21.840629676
což naznačuje docela dobrou úroveň přesnosti.
Zde je vysvětlení částí příkazu:
nohup
- Tím zůstane příkaz, který následuje,watch
v tomto případě z ukončení při ukončení terminálu.watch
- Tento program spouští příkaz opakovaně. Normálně se první obrazovka výstupu z příkazu zobrazí pokaždé, kdyžwatch
spustí příkaz.-n 30
- Interval, ve kterém se má příkaz spustit. V tomto případě je to každých třicet sekund.--precise
- Bez této možnostiwatch
spustí příkaz po interval sekundy. S ním každé spuštění příkazu začíná zapnuto interval pokud možno. Pokud by tato možnost nebyla v příkladu uvedena, časy by se pokaždé prodloužily o více než 30 sekund kvůli času potřebnému ke spuštění a provedení příkazu (yourprog
).yourprog
- Program nebo příkazový řádek prowatch
provést. Pokud příkazový řádek obsahuje znaky speciální pro shell (např. mezeru nebo středník), bude nutné je uvést v uvozovkách.>/dev/null
- Větší než přesměruje výstup příkazu spouštěnéhowatch
do souboru,/dev/null
. Tento soubor zahodí všechna data do něj zapsaná. Tím se zabrání zápisu výstupu na obrazovku nebo odnohup
Pokud je používán, zabraňuje odesílání výstupu do souboru s názvemnohup.out
.&
–watch
příkaz je spuštěn na pozadí a řízení je vráceno terminálu nebo rodičovskému procesu.
Všimněte si, že nohup
, přesměrování výstupu a &
Operátory ovládání na pozadí nejsou specifické pro watch
.
Zde je vysvětlení příkladu yourprog
skript:
date
- Zobrazí aktuální datum a/nebo čas. Může je také nastavit.+%M.%S.%N
- Toto určuje výstupní formát prodate
použít.%M
je aktuální minuta,%S
je aktuální sekunda a%N
je aktuální nanosekunda.>> yourprog.out
- Toto přesměruje výstupdate
příkaz do souboru s názvemyourprog.out
. Dvojité větší než způsobí, že výstup bude připojen k souboru při každém vyvolání, nikoli přepsání předchozího obsahu.
Upravit :
Možná další věc, která by mohla být zneužita (nebo je to možná legitimní použití), jsou systémové časovače.
Viz systemd/Timers jako náhrada cronu a Cron vs systemd timers.
Brzy se pokusím zveřejnit příklad.
Řešení 2:
Pokud vaše úloha potřebuje spouštět tak často, cron je špatný nástroj. Kromě toho, že jednoduše nebude spouštět úlohy tak často, riskujete také vážné problémy, pokud úloha trvá déle, než je interval mezi spouštěním. Přepište svou úlohu tak, aby byla démonizována a trvale běžela, a v případě potřeby ji spusťte z cronu (a přitom se ujistěte, že se znovu nespustí, pokud již běží).
Řešení 3:
Cron je navržen tak, aby se probouzel každou minutu, takže to není možné udělat bez nějakého hackování, například spánku, jak jste zmínil.
Řešení 4:
* * * * * /path/to/program
* * * * * sleep 30; /path/to/program
Nezapomeňte do svého programu něco zapsat, aby se ukončil, pokud již běží předchozí instance.
#!/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
Samozřejmě to stále ponechává velmi malou příležitost k selhání, takže hledejte na Googlu lepší řešení použitelné pro vaše prostředí.
Řešení 5:
Můžete to provést pomocí softwaru třetí strany.
Možnost, která se mi osvědčila, je časté cron
Umožňuje přesnost na milisekundy a dává vám možnost odložit další spuštění, dokud aktuální neskončí..