Posso rendere cron "casuale" cron?


12

Forse sono completamente pazzo, e se è così - va bene. Ma come potrei programmare un lavoro per programmare in modo casuale un messaggio sciocco, come da fortune?

chiarimento
sì - questa è la mia workstation personale - non ho intenzione di fare qualcosa di complicato su un server di produzione :)

Risposte:


12

atha un'interfaccia più semplice per questo tipo di scopo se atè installato, la macchina è in esecuzione atde l'utente può usare il comando.

Ad esempio (controlla l'esatta sintassi usando man ato info at),

at -f file now + 53 minutes

o

at -f file now + 2 hours

eseguirà i comandi nel file specificato in 53 minuti o 2 ore, rispettivamente.

at può quindi essere rieseguito all'inizio del processo pianificato con unità di avvio, conteggio e tempo appropriate (casuali o meno).

modificare

Come Arjan sottolinea utile di seguito, se lo stai usando per un'applicazione diversa da un giocattolo devi pensare a problemi come quello che succede

  1. se la corsa successiva inizia prima della fine di quella precedente (ad es. lo script rientra?) o

  2. se una corsa non viene completata correttamente o

  3. se la corsa successiva non si avvia affatto o in tempo (ad es. cosa succede se la macchina è spenta al momento della partenza della corsa successiva) e

  4. sulla registrazione e la segnalazione di esecuzioni fallite o riuscite.


questo è un approccio che non avevo preso in considerazione - e potrebbe essere reso ricorsivo, se filecontiene la prossima atcorsa, giusto?
Warren,

fantastico - l'ho appena provato e funziona benissimo :)
warren,

2
+1, ma alcune cose da considerare: se il atcomando-è la prima riga e se lo script viene eseguito per un lungo periodo (o se gli intervalli sono brevi), fare attenzione a eseguire più istanze contemporaneamente. Ma quando si attrova all'ultima riga dello script, ovviamente non verrà eseguita alcuna riprogrammazione se lo script fallisce. Inoltre, l'esecuzione dello script dalla riga di comando lo farà anche (ri) programmare da solo (e: potrebbero quindi esistere più pianificazioni contemporaneamente). E cronsupporta l'invio di eventuali errori (o: output in generale) tramite e-mail; Non so se atha anche qualcosa del genere?
Arjan,

@Arjan - Non sono troppo preoccupato che fallisca e non mi mandi un'e-mail .. dal momento che (a questo punto) lo sto solo usando per divertirmi sulla mia postazione di lavoro :) .. tuttavia - È qualcosa su cui pensare se questo fosse esteso, diciamo, a un controllo casuale per intrusione
Warren,

la sceneggiatura che sto immaginando non mi preoccuperà di quante copie di se stessa sono in esecuzione contemporaneamente
warren,

13

Ho molti comandi in / etc / crontab che fanno tutti i tipi di cose e alcuni hanno bisogno di precisione in pochi secondi. Ora cron può avere una risoluzione più fine mantenendo tutti i tempi visibili e centralizzati.

Questo esempio ottiene e analizza una pagina Web tra 10 e 50 secondi prima di ogni 5 minuti:

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

Non deve avere un orario esatto poiché i dati si muovono lentamente, ma aiuta a mantenere il tempo di esecuzione del nodo di munin il più basso possibile senza dover attendere le pagine Web. (Il plugin memorizza ulteriormente la pagina nella cache per 30 minuti per ridurre gli hit non necessari, ma deve aggiornare un database ogni 5 minuti).

Nota \% - cron sostituisce% per "\ n" - utile per mantenere il testo della posta su una riga.


se stai memorizzando nella cache le pagine web, non otterrai necessariamente risultati di caricamento accurati
warren

1
sì, lo so - "i dati si muovono lentamente" - il plug-in ottiene i tassi di cambio da un sito e non voglio essere bannato. (Non sono un commerciante, ma passo molto tempo a guardare i grafici di Monaco) Ho creato un plug-in simile per il clima locale. Applicazioni infinite!
Andy Lee Robinson,

1
aha! .. approccio molto interessante :)
warren

6

Internamente cron, non credo che una tale funzione esista. Penso che la soluzione migliore sarebbe quella di collocare il tuo comando in uno script di shell e posizionare un sleepintervallo casuale nella parte superiore dello script e utilizzare la $RANDOMvariabile. Quindi eseguire lo script una volta al giorno in un normale processo cron.

#!/bin/bash
sleep $(($RANDOM%5))
/path/to/command -param1 -param2

1
sleep () è quasi una garanzia che verrà ucciso dal fornitore di servizi. A meno che, naturalmente, sia il fornitore di servizi.
Un nano,

1
Ho pensato che fosse sulla sua macchina Linux o qualcosa del genere se stava presentando fortuna a caso a qualcuno
John T

bene, è vero.
Un nano,

Perché dormire è una cattiva idea?
Sto

chiarito la domanda per @John T
warren,

6

Dipenderà dal tipo di intervallo che stai cercando. ma supponiamo che tu desideri che lo script venga eseguito in modo casuale con una probabilità di 1:30 (una volta ogni 30 minuti)

  • Costruisci il tuo cron script per una peridiocità di, diciamo 10 minuti. Sparerà 3 volte ogni 30 minuti.

  • All'interno dello script usa rand come condizione per un'istruzione if . Si desidera che rand restituisca un numero compreso tra 0 e 2. Se è 0, eseguire il contenuto dell'istruzione if.

In sostanza il tuo script si attiva sempre a un intervallo prestabilito. Ma eseguirà solo il comando che ti interessa in modo casuale. Il tuo fornitore di servizi ti ringrazierà.


@A Nano - grazie anche a questa idea - questo sarebbe un percorso leggermente più utile se volessi verificare intrusioni, ecc. Su una base frequente ma quasi casuale
warren,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.