Solución 1:
Candidato a la más creativa uso indebido de un comando de Linux:
nohup watch -n 30 --precise yourprog >/dev/null &
Si yourprog
consta de:
date +%M.%S.%N >> yourprog.out
entonces yourprog.out
podría verse como:
50.51.857291267
51.21.840818353
51.51.840910204
52.21.840513307
52.51.842455224
53.21.841195858
53.51.841407587
54.21.840629676
lo que indica un nivel de precisión bastante bueno.
Aquí hay una explicación de las partes del comando:
nohup
- Esto mantiene el comando que le sigue,watch
en este caso, de salir cuando salga la terminal.watch
- Este programa ejecuta un comando repetidamente. Normalmente, la primera pantalla de salida del comando se muestra cada vez quewatch
ejecuta el comando.-n 30
- El intervalo en el que ejecutar el comando. En este caso es cada treinta segundos.--precise
- Sin esta opción,watch
ejecuta el comando después intervalo segundos. Con él, cada inicio del comando comienza activado el intervalo si es posible. Si esta opción no se especificara en el ejemplo, los tiempos se retrasarían más de 30 segundos cada vez debido al tiempo que se tarda en iniciar y ejecutar el comando (yourprog
).yourprog
- El programa o línea de comando parawatch
ejecutar. Si la línea de comando contiene caracteres especiales para el shell (por ejemplo, espacio o punto y coma), deberá estar entre comillas.>/dev/null
- El mayor que redirige la salida del comando ejecutado porwatch
a un archivo,/dev/null
. Ese archivo descarta cualquier dato escrito en él. Esto evita que la salida se escriba en la pantalla o, desdenohup
se está utilizando, evita que la salida se envíe a un archivo llamadonohup.out
.&
- Elwatch
el comando se ejecuta en segundo plano y el control se devuelve al terminal o al proceso principal.
Tenga en cuenta que nohup
, la redirección de la salida y el &
el operador de control de fondo no es específico de watch
.
Aquí hay una explicación del ejemplo yourprog
guión:
date
- Muestra la fecha y/o la hora actual. También puede configurarlos.+%M.%S.%N
- Esto especifica el formato de salida paradate
usar.%M
es el minuto actual,%S
es el segundo actual y%N
es el nanosegundo actual.>> yourprog.out
- Esto redirige la salida deldate
comando a un archivo llamadoyourprog.out
. El doble mayor que hace que la salida se agregue al archivo en cada invocación en lugar de que se sobrescriba el contenido anterior.
Editar :
Posiblemente otra cosa de la que se podría abusar (o tal vez sea un uso legítimo) son los temporizadores systemd.
Vea systemd/Timers como reemplazo de cron y Cron vs systemd timers.
Intentaré publicar un ejemplo pronto.
Solución 2:
Si su tarea necesita ejecutarse con tanta frecuencia, cron es la herramienta incorrecta. Además del hecho de que simplemente no iniciará trabajos con tanta frecuencia, también corre el riesgo de sufrir algunos problemas graves si el trabajo tarda más en ejecutarse que el intervalo entre inicios. Vuelva a escribir su tarea para convertirla en daemon y ejecutarla de manera persistente, luego iníciela desde cron si es necesario (mientras se asegura de que no se reinicie si ya se está ejecutando).
Solución 3:
Cron está diseñado para despertarse cada minuto, por lo que no es posible hacerlo sin piratear, por ejemplo, dormir como mencionaste.
Solución 4:
* * * * * /path/to/program
* * * * * sleep 30; /path/to/program
No olvide escribir algo en su programa para que salga si ya se está ejecutando una instancia anterior.
#!/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
Por supuesto, esto todavía deja una oportunidad muy pequeña para fallar, así que busque en Google una mejor solución aplicable a su entorno.
Solución 5:
Puede hacerlo con software de terceros.
Una opción que me ha funcionado bien es frecuente-cron
Permite una precisión de milisegundos y te da la opción de diferir la siguiente ejecución hasta que haya finalizado la actual.