Come posso ottenere uno script da eseguire ogni giorno su Mac OS X?


Risposte:


62

Per riferimento, tutte e 3 le opzioni funzionerebbero. L'opzione iCal ha tuttavia più limiti degli altri.

(Esistono GUI per la modifica di cron e launchd, come indicato in altre risposte)

Cron è il più semplice e noto e ci sono molti tutorial disponibili. Coles Notes è quello di aggiungere l'ultima riga dal basso al tuo crontab (modificando /etc/crontabo usando crontabdalla riga di comando):

MM HH DD MM WKD -- Minutes, Hour, Day, Month, Weekday (eg. Sun, Mon)
MM HH * * * USERNAME /PATH/TO/SCRIPT
00 3 * * * chealion /myscript.sh "Runs at 03:00 every day"

In Mac OS X, cronè stato effettivamente sostituito da launchdma launchdè retrocompatibile con il cronsignificato che puoi ancora usare cronma in realtà launchdsta facendo tutto il lavoro.

Se si desidera utilizzare, launchdè necessario controllare anche altre domande qui su Super User: (ad esempio, come eseguire un comando launchd come root? ) Su dove si desidera salvare il file di configurazione (il file plist) come quando funziona dipende dalla directory in cui è memorizzata e da come viene caricata (es. se hai usato sudo o meno) - simile a cron.

Di seguito è riportato un esempio di esecuzione del programma di avvio giornaliero (assicurarsi che il file e l'etichetta siano uguali - meno il programma di installazione per l'etichetta) - questo script viene eseguito ogni giorno a mezzanotte 3 minuti:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>local.IDENTIFIER_HERE.SOMETHING</string>
    <key>KeepAlive</key>
    <false/>
    <key>RunAtLoad</key>
    <false/>
    <key>UserName</key>
    <string>USERNAME HERE</string>
    <key>Program</key>
    <string>/PATH/TO/SCRIPT</string>
    <key>ProgramArguments</key>
    <array>
        <string>Argument_1</string>
        <string>Argument_2</string>
    </array>
    <key>StartCalendarInterval</key>
    <dict>
        <key>Hour</key>
        <integer>00</integer>
        <key>Minute</key>
        <integer>03</integer>
    </dict>
</dict>
</plist>

Vale anche la pena notare che le attività avviate se erano programmate per quando il computer è inattivo o spento, verranno eseguite quando il computer sarà nuovamente disponibile (accendendolo o riattivandolo) - anche se solo una volta, non importa quanti giorni potrebbe avere stato. Modifica: ero appena su un documento Apple che diceva che se la macchina è spenta, durante quel periodo perderai eventuali eventi di avvio (il tuo script non si avvierà all'avvio), (sleep fa partire lo script al risveglio)


Un'altra opzione è usare " at " (controlla la pagina di manuale con "man at"). Lo script può riprogrammare se stesso con es:

echo "sh $0 $@" | at `date +%H:%M` tomorrow

(usa "+ 10 minuti" invece di "domani" per eseguirlo ogni 10 minuti; per interrompere la pianificazione, fai semplicemente "at -l" per elencare gli ID lavoro pianificati e poi "at -r id " per rimuovere il lavoro)

Potrebbe essere necessario avviare prima il demone corrispondente (atrun) con (consultare https://superuser.com/a/43680 ):

sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.atrun.plist

Vantaggi: correzione rapida, nessun accesso sudo / root necessario, schemi di pianificazione complicati da eseguire Svantaggi: metodo di pianificazione non standard per OS X (che viene avviato)


8
Signore, per il tuo esempio di file di configurazione di avvio, potrei baciarti . Ma non lo farò.
Paul D. Waite,

5
launchdè la strada da percorrere con OS X.
zneak,

Sì, questa è stata la mia impressione. Sembra che abbia avuto qualche problema in Tiger, ma Apple sembra averlo affilato da allora.
Paul D. Waite,

Su Os 10.7.4 non esiste alcun file / etc / crontab. ): Quindi ho fatto 'quale crontab' e che mi ha dato / usr / bin / crontab ma questo è un file confuso.
Hermann Ingjaldsson,

@HermannIngjaldsson / usr / bin / crontab è un programma; se lo esegui in un Terminale con crontab -e, ti trascinerà in un editor di testo basato su Terminale su un file che diventerà il tuo crontab personale quando lo salvi.
Mark Reed,

8

LaunchControl è un'altra GUI per launchd / launchctl. Mentre le alternative citate da altri sono perfettamente in grado di lanciare uno script su base giornaliera, con LaunchControl puoi configurare pianificazioni complesse (come "una volta ogni giorno della settimana, nei fine settimana ogni ora tra le 14:00 e le 20:00"). Inoltre è (AFAIK) l'unico strumento che convalida effettivamente il lavoro. Se un lavoro non funziona come previsto ti mostrerà il perché.

È libero di provare per tutto il tempo che desideri.


3
Mentre è libero di provare / utilizzare, lo sviluppatore preferisce che tu paghi per la licenza. sites.fastspring.com/somazone/product/shop
Kent,

1
Assolutamente. Il motivo per cui ho pubblicato questa risposta in primo luogo è stato quello di supportare lo sviluppatore.
Mark Hall,

5

CronniX è un bel frontend GUI per la pianificazione dei lavori cron sul Mac ... Abbastanza decente se non si vuole andare e approfondire la documentazione cron.


2
  • Per iCal potresti voler leggere questo articolo .
  • Dovresti trovare abbastanza tutorial per cronse google per questo.

Dipende da quello che vuoi: gli script iCal verranno eseguiti solo se hai effettuato l'accesso, cronesegue lo script senza essere connesso. Non so se iCal esegue uno script se il Mac è stato spento al momento in cui lo script dovrebbe avere stato eseguito. cronsta facendo questo.




2

Ecco un'utilità semplice e gratuita per generare XML plist:

http://www.gieson.com/Library/projects/utilities/launcha/

Con questo programma di utilità non è necessario installare un programma, è sufficiente salvare i risultati nella cartella Libreria / LaunchAgents.


Attenzione: se si utilizza questo strumento, assicurarsi che RunAtStartsia impostato su false (a meno che non lo si desideri vero). Ho impiegato un'ora a capire perché il mio Finder si sarebbe bloccato e avrebbe impedito il caricamento del desktop all'avvio. La disabilitazione RunAtStartnon interferisce con la pianificazione fissa.
Andrea Lazzarotto,

1

Uso sempre Lingon per questo, ma sembra che sia fuori sviluppo. Potresti provare Crontooie , ma non l'ho mai usato personalmente. O semplicemente modifica il file crontab nel terminale.


Mi sembra che Lingon sia in fase di sviluppo attivo ; la versione corrente 3 è disponibile nell'App Store insieme alla versione precedente 2. Entrambi costano pochi dollari e ricevono recensioni molto contrastanti. Personalmente uso Lingon 3 con un certo successo, ma non lo consiglierei ai fini di questo articolo rispetto ad altri strumenti citati in altre risposte (cron, at, ecc.).
ssc,

L'ultima volta che ho usato Lingon è stato oltre 2 anni fa. Al momento ha funzionato bene per me, ma non ho usato i versetti recenti. Peccato che non sia affidabile come una volta.
Josh,

0
sp@mactop ~ $ crontab -l
*/5 * * * * /usr/local/bin/cinco.sh
sp@mactop ~ $ cat /usr/local/bin/cinco.sh
#!/bin/sh
....cut....
sp@mactop ~ $ 

... qualunque riga di comando passi per ".... tagliare ...." verrà eseguita ogni cinque minuti.

30 anni di progressi e "cron" è ancora il mio programmatore preferito.

-C


0

Se un evento di calendario soddisfa le tue esigenze, l'applicazione Automator integrata ti consente anche di creare allarmi di calendario attivati ​​da eventi di calendario. È possibile utilizzare alcune delle azioni basate sull'interfaccia utente incorporate per fare ciò che si desidera, oppure è anche possibile che esegua un'applicazione o uno script AppleScript, JavaScript o shell personalizzato.

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.