Pianificare comodamente un comando da eseguire in seguito?


87

Qual è un modo semplice per eseguire un comando, diciamo, tra 8 ore da ora? Posso pensare in questo modo:

nohup bash -c "sleep 28800 ; ./mycommand.sh" &

Esiste un modo più "corretto"?


C'è qualcosa di sbagliato in nohup+ sleep? Perché è "improprio"?
cprn,

Risposte:


123

Puoi usare il atcomando La ateseguire comandi in un secondo momento. L' atutilità deve leggere i comandi dall'input standard e raggrupparli come un lavoro, da eseguire in un secondo momento.

Di solito, atè installato di default in Ubuntu, ma se la tua versione non lo include, installa tramite:

sudo apt-get install at

Per ulteriori informazioni, opzioni, esempi e altro, consultare il repository Manpage di Ubuntu

Esempio:

at now +8 hours -f ~/myscript.sh

Puoi anche usare comode shorthands, come tomorrowo noon, come in

echo "tweet fore" | at teatime 

Avvertenza: questo eseguirà immediatamente il comando a sinistra della pipema presenterà il suo output solo in seguito. L'esempio mostra anche come è possibile reindirizzare le azioniat. at -cè il modo in cui puoi esaminare le azioni programmate, che puoi elencare comodamente con il loro numero, come con:

at -c 3

19
Potrebbe essere utile aggiungere un semplice esempio di utilizzo che affronti più specificamente la domanda del poster originale, ad esempioat now +8 hours -f ~/myscript.sh
steeldriver,

6
Inoltre, è at 8:00necessario eseguire il comando in un momento assoluto e batchper "quando sembra che il computer sia inattivo"
Simon Richter

4
Nel caso qualcuno si stesse chiedendo, teatimeè alle 16:00. Per alcuni motivi non è menzionato in manpages.ubuntu.com/manpages/raring/man1/at.1posix.html ma è presente man ate qui manpages.ubuntu.com/manpages/raring/en/man1/at.1.html .
Dan,

3
Forse possiamo menzionare che l'utilità "at" non è installata per impostazione predefinita e se qualcun altro vuole ottenerla semplicemente installa il pacchetto "at"? Modifica: Ad ogni modo, ho semplicemente modificato la risposta (risolto anche il link alla manpage).
heartsmagic,

4
Attenzione che il piping in at eseguirà immediatamente il comando e pianificherà solo l'output. Ho avuto un errore di stampa 3D di 4 ore perché volevo programmare gpio write 8 1ma è stato eseguito immediatamente.
Maciej Swic,

8

Sì, è possibile impostare un processo cron.

Ad esempio, se ora sono le 14:39:00 e oggi è venerdì, 30 agosto, puoi aggiungere il seguente cron job (da eseguire dopo 8 ore) nel tuo file crontab usando il crontab -ecomando:

39 22 30 8 5  /path/to/mycommand.sh

Di più:


3
Ok, sì, avrei dovuto menzionare che conosco i lavori di Cron. Questo è ancora più disordinato perché poi si trova nel crontab indefinitamente, giusto?
Steve Bennett,

4
@ RaduRădeanu: con cron, attento che potrebbe sparare di nuovo in pochi anni (quando ci sarà un altro 30 agosto di venerdì) ...
Olivier Dulac

2
Questo è un trucco intelligente. Comunque 'at' è un modo molto migliore. Cosa accadrebbe se il computer fosse spento alle 14:39?
emory

1
Err non è ancora il mio punto. Il mio punto è che il testo che hai inserito sarà (credo) letteralmente ancora seduto nel tuo crontab dopo l'evento, creando un'altra attività di pulizia per te.
Steve Bennett,

2
@SteveBennett Sì, hai ragione. Il comando rimarrà nel tuo crontabfino a quando non lo rimuoverai. Un anno dopo, quando avrai dimenticato chi l'ha messo lì e perché, rimarrai a grattarti la testa chiedendoti cosa fare con il comando.
Paddy Landau,

8

Utilizzare l'interfaccia grafica Gnome-based per cron, ate simili:

L'introduzione di CronHowto suggerisce di usare la gnome-schedulegui, che è molto più bella che digitare tutta la spazzatura nel terminale (specialmente per gli utenti Ubuntu "medi" che non sono "power" * utenti nix / bsd).

Eseguilo utilizzando Unity Dash (o il menu di altre applicazioni) per cercare attività pianificate o in esecuzione gnome-schedule.

Sui sistemi Ubuntu basati su Gnome Gnome Strumento attività pianificate (dal pacchetto gnome-schedule) in Applicazioni -> Strumenti di sistema fornisce un'interfaccia grafica con la richiesta di utilizzare Cron. Il sito web del progetto è http://gnome-schedule.sourceforge.net/ ; il software è installabile dal Software Center o digitando

sudo apt-get install gnome-schedule

in un terminale.

Usando gnome-schedule, per uno script nella tua home directory, un nuovo comando "at" verrebbe impostato usando questo tipo di finestra:

inserisci qui la descrizione dell'immagine


5

Ho trovato un modo rapido e sporco per farlo prima di scoprire che atera una cosa.

Supponiamo che tu voglia eseguire lo script a mezzogiorno:

until [[ "$(date)" =~ "12:00:" ]]; do
    sleep 10
done
./mycommand.sh

Di 'che vuoi che funzioni domani a mezzogiorno (oggi è il 24 novembre per me):

until [[ "$(date)" =~ "25 12:00:" ]]; do 
    sleep 30
done
./mycommand.sh

Aggiornamento : metodo leggermente migliore: prova solo i numeri che ti interessano, usando date +FORMAT:

until [[ $(date +%H:%M) == 21:06 ]]; do
    ...

10
Per le due persone che hanno upvoted questa risposta, si prega di utilizzare at, crono qualsiasi altra applicazione vera e propria pianificazione. La pianificazione delle attività è difficile e non è una ruota che dovresti reinventare.
dimo414,

1
@ dimo414 Cosa c'è che non va nel mio metodo?
wjandrea,

8
Come minimo, è occupato, il che è dispendioso. Peggio ancora, non è garantito che sia corretto; è perfettamente possibile (se improbabile) che il condizionale venga perso. Basare lo scheduler su espressioni regolari è anche soggetto a errori. Potrebbe funzionare abbastanza bene , ma non ha vantaggi at.
dimo414,

(A parte: non ho
votato in negativo la

4
Un altro motivo da utilizzare atè perché i suoi lavori sopravvivranno al riavvio.
arte
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.