Soluzione 1:
Candidato per il più creativo uso improprio di un comando Linux:
nohup watch -n 30 --precise yourprog >/dev/null &
Se yourprog
consiste di:
date +%M.%S.%N >> yourprog.out
poi yourprog.out
potrebbe essere simile a:
50.51.857291267
51.21.840818353
51.51.840910204
52.21.840513307
52.51.842455224
53.21.841195858
53.51.841407587
54.21.840629676
indicando un buon livello di precisione.
Ecco una spiegazione delle parti del comando:
nohup
- Questo mantiene il comando che lo segue,watch
in questo caso, dall'uscita quando il terminale esce.watch
- Questo programma esegue ripetutamente un comando. Normalmente la prima schermata dell'output del comando viene visualizzata ogni voltawatch
esegue il comando.-n 30
- L'intervallo in cui eseguire il comando. In questo caso ogni trenta secondi.--precise
- Senza questa opzione,watch
esegue il comando dopo intervallo secondi. Con esso, ogni inizio del comando inizia acceso l'intervallo, se possibile. Se questa opzione non fosse specificata nell'esempio, i tempi sarebbero sempre successivi di oltre 30 secondi ogni volta a causa del tempo necessario per avviare ed eseguire il comando (yourprog
).yourprog
- Il programma o la riga di comando perwatch
eseguire. Se la riga di comando contiene caratteri speciali per la shell (ad es. spazio o punto e virgola) dovrà essere quotata.>/dev/null
- Il maggiore di reindirizza l'output del comando eseguito dawatch
in un file,/dev/null
. Quel file elimina tutti i dati scritti su di esso. Ciò impedisce che l'output venga scritto sullo schermo o, poichénohup
viene utilizzato, impedisce l'invio dell'output a un file chiamatonohup.out
.&
- Ilwatch
il comando viene eseguito in background e il controllo viene restituito al terminale o al processo padre.
Nota che nohup
, il reindirizzamento dell'output e il &
gli operatori di controllo in background non sono specifici di watch
.
Ecco una spiegazione dell'esempio yourprog
script:
date
- Emette la data e/o l'ora correnti. Può anche impostarli.+%M.%S.%N
- Questo specifica il formato di output perdate
usare.%M
è il minuto corrente,%S
è il secondo corrente e%N
è il nanosecondo corrente.>> yourprog.out
- Questo reindirizza l'output deldate
comando in un file chiamatoyourprog.out
. Il doppio maggiore di fa sì che l'output venga aggiunto al file a ogni invocazione anziché che il contenuto precedente venga sovrascritto.
Modifica :
Forse un'altra cosa di cui si potrebbe abusare (o forse è un uso legittimo) sono i timer di sistema.
Vedi systemd/Timers come sostituto di cron e Cron vs systemd timer.
Proverò presto a postare un esempio.
Soluzione 2:
Se la tua attività deve essere eseguita così frequentemente, cron è lo strumento sbagliato. A parte il fatto che semplicemente non avvierà i lavori così frequentemente, si rischiano anche seri problemi se l'esecuzione del lavoro richiede più tempo rispetto all'intervallo tra i lanci. Riscrivi la tua attività in modo che venga demonizzata ed eseguita in modo persistente, quindi avviala da cron se necessario (assicurandoti che non venga riavviata se è già in esecuzione).
Soluzione 3:
Cron è progettato per svegliarsi ogni minuto, quindi non è possibile farlo senza qualche hacking, ad esempio dormi come hai detto.
Soluzione 4:
* * * * * /path/to/program
* * * * * sleep 30; /path/to/program
Non dimenticare di scrivere qualcosa nel tuo programma in modo che esca se un'istanza precedente è già in esecuzione.
#!/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
Naturalmente, questo lascia ancora una piccola possibilità di fallimento, quindi cerca su Google una soluzione migliore applicabile al tuo ambiente.
Soluzione 5:
Puoi farlo con software di terze parti.
Un'opzione che ha funzionato bene per me è frequent-cron
Consente la precisione al millisecondo e ti dà la possibilità di posticipare l'esecuzione successiva fino a quando quella corrente non è terminata.