Bagaimana saya bisa menjalankan skrip setiap hari di Mac OS X?

Jawaban:

62

Untuk referensi, ketiga opsi akan bekerja. Namun opsi iCal memiliki keterbatasan lebih dari yang lain.

(Ada GUI untuk mengedit cron dan launchd seperti yang disebutkan dalam jawaban lain)

Cron adalah yang paling lurus ke depan dan terkenal dan ada banyak tutorial yang tersedia. Catatan Coles adalah menambahkan baris terakhir dari bawah ke crontab Anda (baik dengan mengedit /etc/crontabatau menggunakan crontabpada baris perintah):

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"

Di Mac OS X, cronsebenarnya telah diganti oleh launchdtetapi launchdkompatibel dengan yang cronberarti Anda masih dapat menggunakan crontetapi sebenarnya launchdmelakukan semua pekerjaan.

Jika Anda ingin menggunakan, launchdAnda juga ingin memeriksa pertanyaan-pertanyaan lain di sini di Super User: (mis. Bagaimana cara menjalankan perintah launchd sebagai root? ) Tentang di mana Anda ingin menyimpan file konfigurasi Anda (file plist) ketika dijalankan tergantung pada direktori tempat penyimpanan dan bagaimana memuatnya (mis. apakah Anda menggunakan sudo atau tidak) - mirip dengan cron.

Contoh menjalankan daftar peluncuran harian (pastikan file dan labelnya sama - minus daftar untuk label) berikut - skrip ini dijalankan setiap hari pada pukul 3 lewat tengah malam:

<?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>

Perlu juga dicatat bahwa tugas launchd jika mereka dijadwalkan ketika komputer sedang tidur atau mati, mereka akan berjalan ketika komputer menjadi tersedia lagi (menyalakan atau membangunkannya) - meskipun hanya sekali tidak peduli berapa hari itu mungkin memiliki telah. Sunting: Saya baru saja berada di dokumen Apple yang mengatakan bahwa jika mesin mati, maka Anda akan kehilangan acara peluncuran apa pun selama waktu itu, (skrip Anda tidak akan diluncurkan saat startup), (sleep tidak mengaktifkan skrip saat bangun)


Pilihan lain adalah menggunakan " at " (periksa halaman manual dengan "man at"). Script dapat menjadwal ulang dengan:

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

(gunakan "+ 10 menit" alih-alih "besok" untuk menjalankannya setiap 10 menit; untuk berhenti menjadwalkan, cukup lakukan "at -l" untuk mendaftar id pekerjaan yang dijadwalkan dan kemudian "at -r id " untuk menghapus pekerjaan)

Anda mungkin harus memulai daemon terkait (atrun) terlebih dahulu dengan (lihat https://superuser.com/a/43680 ):

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

Keuntungan: perbaikan cepat, tidak diperlukan sudo / akses root, pola jadwal yang rumit dan mudah Kerugian: bukan metode penjadwalan standar untuk OS X (yang diluncurkand)

Chealion
sumber
8
Pak, misalnya file konfigurasi launchd Anda, saya bisa mencium Anda. Tapi aku tidak mau.
Paul D. Waite
5
launchdadalah cara untuk pergi di bawah OS X.
zneak
Ya, itu kesan saya. Kedengarannya seperti memiliki beberapa masalah di Tiger, tetapi Apple tampaknya telah mempertajamnya sejak itu.
Paul D. Waite
Pada Os 10.7.4 tidak ada file / etc / crontab. ): Jadi saya melakukan 'yang crontab' dan itu memberi saya / usr / bin / crontab tapi itu file yang rusak.
Hermann Ingjaldsson
@HermannIngjaldsson / usr / bin / crontab adalah sebuah program; jika Anda menjalankannya di Terminal dengan crontab -e, itu akan menjatuhkan Anda ke editor teks berbasis terminal pada file yang akan menjadi crontab pribadi Anda ketika Anda menyimpannya.
Mark Reed
8

LaunchControl adalah GUI lain untuk launchd / launchctl. Sementara alternatif yang disebutkan oleh orang lain sangat mampu meluncurkan skrip setiap hari, dengan LaunchControl Anda dapat mengkonfigurasi jadwal yang rumit (seperti "sekali setiap hari kerja, pada akhir pekan setiap jam antara pukul 14:00 dan 20:00"). Juga (AFAIK) satu-satunya alat yang benar-benar memvalidasi pekerjaan. Jika suatu pekerjaan tidak berjalan seperti yang diharapkan, itu akan menunjukkan alasannya.

Ini gratis untuk dicoba selama yang Anda inginkan.

Mark Hall
sumber
3
Meskipun gratis untuk dicoba / digunakan, pengembang lebih suka Anda membayar lisensi. sites.fastspring.com/somazone/product/shop
Kent
1
Benar. Alasan mengapa saya memposting jawaban ini di tempat pertama adalah untuk mendukung pengembang.
Mark Hall
5

CronniX adalah antarmuka GUI yang bagus untuk menjadwalkan pekerjaan cron di mac ... Cukup layak jika Anda tidak ingin pergi dan mempelajari dokumentasi cron.

Zoran
sumber
2
  • Untuk iCal Anda mungkin ingin membaca artikel ini .
  • Anda harus menemukan tutorial yang cukup untuk cronjika Anda google untuk itu.

Tergantung pada apa yang Anda inginkan: skrip iCal hanya akan dieksekusi jika Anda masuk, cronmengeksekusi skrip tanpa login. Saya tidak tahu apakah iCal mengeksekusi skrip jika Mac dihidupkan pada saat skrip seharusnya memiliki telah dieksekusi. cronsedang melakukan ini.

Felix
sumber
2

Pembaruan: Anda dapat memeriksa beberapa aplikasi di Mac OS X App Store yang melakukan ini:

Lingon juga tampaknya tersedia, tergantung pada OS yang Anda jalankan.

Steve Cooley
sumber
2

Berikut ini adalah utilitas sederhana dan gratis untuk menghasilkan XML plist:

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

Dengan utilitas ini tidak perlu menginstal program, cukup simpan hasilnya ke folder Library / LaunchAgents Anda.

bob
sumber
Peringatan: jika Anda menggunakan alat ini, pastikan itu RunAtStartdisetel ke false (kecuali jika Anda menginginkannya benar). Saya menghabiskan satu jam mencari tahu mengapa Finder saya akan membeku dan menghentikan desktop dari memuat saat boot. Penonaktifan RunAtStarttidak mengganggu jadwal tetap.
Andrea Lazzarotto
1

Saya selalu menggunakan Lingon untuk ini, tetapi sepertinya tidak dikembangkan. Anda dapat mencoba Crontooie , tetapi saya tidak pernah menggunakannya secara pribadi. Atau cukup edit file crontab di terminal.

Josh
sumber
Sepertinya saya Lingon sedang dalam pengembangan aktif ; versi saat ini 3 tersedia di AppStore bersama dengan versi sebelumnya 2. Keduanya berharga beberapa dolar dan menerima ulasan yang sangat beragam. Saya pribadi menggunakan Lingon 3 dengan beberapa keberhasilan, tetapi tidak akan merekomendasikannya untuk tujuan dalam artikel ini di atas alat lain yang disebutkan dalam jawaban lain (cron, at, dll).
ssc
Terakhir kali saya menggunakan Lingon adalah lebih dari 2 tahun yang lalu. Pada saat itu bekerja dengan baik untuk saya, tetapi saya belum menggunakan ayat-ayat baru-baru ini. Sayang sekali itu tidak dapat diandalkan seperti dulu.
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 ~ $ 

... perintah apa pun yang Anda masukkan untuk ".... cut ...." akan dijalankan setiap lima menit.

30 tahun kemajuan, dan 'cron' masih merupakan penjadwal favorit saya.

-C

CJ Steele
sumber
0

Jika acara kalender memenuhi kebutuhan Anda, aplikasi Automator bawaan juga memungkinkan Anda membuat Alarm Kalender yang dipicu oleh acara kalender. Anda dapat menggunakan beberapa tindakan berbasis UI bawaan untuk melakukan apa yang Anda inginkan, atau Anda juga dapat menjalankan beberapa aplikasi atau kustom AppleScript, JavaScript, atau skrip shell.

Brett Zamir
sumber