¿Puedo hacer cron "aleatorio"?

12

Tal vez estoy completamente loco, y si es así, está bien. Pero, ¿cómo programaría un trabajo para emitir un mensaje aleatorio, como desde fortune?

aclaración
sí, esta es mi estación de trabajo personal, no planeo hacer algo inestable en un servidor de producción :)

madriguera
fuente

Respuestas:

12

attiene una interfaz más simple para este tipo de propósito si atestá instalado, la máquina está funcionando atdy el usuario puede usar el comando.

Por ejemplo (verifique la sintaxis exacta usando man ato info at),

at -f archivo now + 53 minutes

o

at -f archivo now + 2 hours

ejecutará los comandos en el archivo especificado en 53 minutos o 2 horas, respectivamente.

at luego se puede volver a ejecutar al comienzo del trabajo programado con unidades adecuadas de inicio, conteo y tiempo (aleatorio o de otro tipo).

Editar

Como Arjan señala útilmente a continuación, si está utilizando esto para otra aplicación que no sea un juguete, debe pensar en problemas como lo que sucede

  1. si la próxima ejecución comienza antes de que termine la anterior (por ejemplo, ¿el script es reentrante?) o

  2. si una ejecución no se completa correctamente o

  3. si la próxima ejecución no se inicia a tiempo o a tiempo (por ejemplo, qué sucede si la máquina está apagada cuando la próxima ejecución debe comenzar) y

  4. sobre el registro e informes de ejecuciones fallidas o exitosas.

mas
fuente
ese es un enfoque que no había considerado, y podría hacerse recursivo, si filecontiene la próxima atejecución, ¿correcto?
warren
genial - solo lo probé, y funciona genial :)
warren
2
+1, pero hay algunas cosas a tener en cuenta: si el atcomando es la primera línea y si el script se ejecuta durante mucho tiempo (o si los intervalos son cortos), tenga cuidado de ejecutar varias instancias simultáneamente. Pero cuando atestá en la última línea del guión, entonces obviamente no se volverá a programar si el guión falla. Además, ejecutar el script desde la línea de comandos hará que (re) se programe también (y: podrían existir múltiples programaciones simultáneamente). Y cronadmite el envío de cualquier error (o: salida en general) por correo electrónico; No sé si attiene algo así también?
Arjan
@Arjan: no estoy demasiado preocupado por si falla y no me envía un correo electrónico ... ya que (en este momento) solo lo estoy usando para divertirme en mi estación de trabajo :) ... sin embargo, eso es algo en lo que pensar si esto se amplió a, por ejemplo, un control aleatorio de la intrusión
Warren
el guión que estoy imaginando no importa cuántas copias de sí mismo se están ejecutando a la vez
Warren
13

Tengo muchos comandos en / etc / crontab que hacen todo tipo de cosas y algunos necesitan precisión en segundos. Ahora cron puede tener una resolución más fina mientras mantiene todos los tiempos visibles y centralizados.

Este ejemplo obtiene y analiza una página web entre 10 y 50 segundos antes de cada 5 minutos:

4-59/5 * * * * root (sleep $(($RANDOM\%40+10))) && /etc/munin/plugins/someplugin prefetch

No tiene que tener un tiempo exacto ya que los datos se mueven lentamente, pero ayuda a mantener el tiempo de ejecución del nodo munin lo más bajo posible al no tener que esperar a las páginas web. (El complemento almacena en caché la página durante 30 minutos para reducir las visitas innecesarias, pero necesita actualizar una base de datos cada 5 minutos).

Tenga en cuenta que \% - cron sustituye% por "\ n" - útil para mantener el texto del correo en una línea.

Andy Lee Robinson
fuente
si está almacenando en caché las páginas web, no necesariamente obtendrá resultados de carga precisos
Warren
1
Sí, lo sé: "los datos se mueven lentamente": el complemento obtiene los tipos de cambio de un sitio y no quiero que se me prohíba. (No soy comerciante, pero paso mucho tiempo mirando gráficos munin) Hice un complemento similar para el clima local. ¡Aplicaciones sin fin!
Andy Lee Robinson
1
aha! .. enfoque muy genial :)
Warren
6

Internamente cron, no creo que tal característica exista. Creo que la mejor solución sería colocar su comando en un script de shell, y colocar un sleepintervalo aleatorio en la parte superior del script y usar la $RANDOMvariable. Luego ejecute el script una vez al día en un trabajo cron regular.

#!/bin/bash
sleep $(($RANDOM%5))
/path/to/command -param1 -param2
John T
fuente
1
sleep () es casi una garantía de que el proveedor de servicios lo eliminará. A menos, por supuesto, que él sea el proveedor del servicio.
Un enano
1
Supuse que estaba en su propia máquina Linux o algo así si está presentando fortuna al azar a alguien
John T
bien, eso es cierto.
Un enano
¿Por qué dormir es una mala idea? Solo preguntaba ...
Tadeusz A. Kadłubowski
aclaró la pregunta para @John T
warren
6

Dependerá de qué tipo de intervalo esté buscando. pero supongamos que desea que el script se ejecute al azar con una probabilidad de 1:30 (una vez cada 30 minutos)

  • Construya su secuencia de comandos cron para un peridiocity de, digamos 10 minutos. Se disparará 3 veces cada 30 minutos.

  • Dentro del script, use rand como condición para una instrucción if . Desea que rand devuelva un número entre 0 y 2. Si es 0, ejecute el contenido de la instrucción if.

Esencialmente, su script siempre se dispara a un intervalo establecido. Pero solo ejecutará el comando que le interesa al azar. Su proveedor de servicios se lo agradecerá.

Un enano
fuente
@A Dwarf, gracias por esta idea también, esta sería una ruta un poco más útil si quisiera buscar intrusiones, etc. de forma frecuente pero casi aleatoria
Warren