Ini adalah Pertanyaan Canonical tentang penggunaan cron & crontab.
Anda telah diarahkan ke sini karena komunitas cukup yakin bahwa jawaban untuk pertanyaan Anda dapat ditemukan di bawah. Jika pertanyaan Anda tidak dijawab di bawah, maka jawabannya akan membantu Anda mengumpulkan informasi yang akan membantu komunitas membantu Anda. Informasi ini harus diedit menjadi pertanyaan awal Anda.
Jawaban untuk ' Mengapa crontab saya tidak berfungsi, dan bagaimana saya bisa memecahkan masalah itu? 'bisa dilihat di bawah ini. Ini membahas cron
sistem dengan crontab yang disorot.
Jawaban:
Bagaimana memperbaiki semua masalah / masalah terkait crontab Anda (Linux)
Pertama, terminologi dasar:
Selanjutnya, edukasi tentang cron:
Setiap pengguna pada suatu sistem dapat memiliki file crontab mereka sendiri. Lokasi file root dan crontab pengguna bergantung pada sistem tetapi biasanya di bawah
/var/spool/cron
.Ada file sistem-lebar
/etc/crontab
,/etc/cron.d
direktori mungkin berisi fragmen crontab yang juga dibaca dan ditindaklanjuti oleh cron. Beberapa distribusi Linux (mis. Red Hat) juga memiliki/etc/cron.{hourly,daily,weekly,monthly}
direktori, skrip di dalamnya yang akan dieksekusi setiap jam / hari / minggu / bulan, dengan privilege root.root selalu dapat menggunakan perintah crontab; pengguna reguler mungkin atau mungkin tidak diberi akses. Ketika Anda mengedit file crontab dengan perintah
crontab -e
dan menyimpannya, crond mengeceknya untuk validitas dasar tetapi tidak menjamin file crontab Anda terbentuk dengan benar. Ada file bernamacron.deny
yang akan menentukan pengguna mana yang tidak dapat menggunakan cron. Lokasicron.deny
file tergantung pada sistem dan dapat dihapus yang akan memungkinkan semua pengguna untuk menggunakan cron.Jika komputer tidak dinyalakan atau crond daemon tidak berjalan, dan tanggal / waktu untuk menjalankan perintah telah berlalu, crond tidak akan mengejar dan menjalankan kueri yang lalu.
keterangan crontab, cara merumuskan perintah:
Perintah crontab diwakili oleh satu baris. Anda tidak dapat menggunakan
\
untuk memperluas perintah melalui beberapa baris. Tanda hash (#
) mewakili komentar yang berarti apa pun pada baris itu diabaikan oleh cron. Ruang kosong dan garis-garis kosong terkemuka diabaikan.Berhati-hatilah saat menggunakan tanda persen (
%
) di perintah Anda Kecuali mereka lolos\%
mereka dikonversi menjadi baris baru dan semuanya setelah non-lolos pertama%
diteruskan ke perintah Anda di stdin.Ada dua format untuk file crontab:
Crontab pengguna
Sistem luas
/etc/crontab
dan/etc/cron.d
fragmenPerhatikan bahwa yang terakhir membutuhkan nama pengguna. Perintah akan dijalankan sebagai pengguna yang disebutkan.
5 bidang pertama dari baris mewakili waktu ketika perintah harus dijalankan. Anda dapat menggunakan angka atau nama hari / bulan yang berlaku dalam spesifikasi waktu.
,
) digunakan untuk menentukan daftar, misalnya 1,4,6,8 yang berarti dijalankan pada 1,4,6,8.-
) dan dapat digabungkan dengan daftar misalnya 1-3,9-12 yang berarti antara 1 dan 3 kemudian antara 9 dan 12./
karakter dapat digunakan untuk memperkenalkan langkah misalnya 2/5 yang berarti mulai dari 2 maka setiap 5 (2,7,12,17,22 ...). Mereka tidak membungkus melewati akhir.*
) di bidang menandakan seluruh rentang untuk bidang itu (misalnya0-59
untuk bidang menit).*/2
menandakan mulai dari minimum untuk bidang yang relevan kemudian setiap 2 misalnya 0 untuk menit (0,2 ... 58), 1 untuk bulan (1,3 ... 11) dll.Men-debug perintah cron
Periksa suratnya!
Secara default cron akan mengirimkan output apa pun dari perintah ke pengguna menjalankan perintah sebagai. Jika tidak ada output maka tidak akan ada email. Jika Anda ingin cron mengirim email ke akun lain maka Anda dapat mengatur variabel lingkungan MAILTO dalam file crontab misalnya
Tangkap output sendiri
Anda dapat mengarahkan stdout dan stderr ke file. Sintaks yang tepat untuk menangkap keluaran dapat bervariasi tergantung pada apa yang digunakan cron shell. Berikut adalah dua contoh yang menyimpan semua output ke file di
/tmp/mycommand.log
:Lihatlah log
Cron mencatat aksinya melalui syslog, yang (tergantung pada pengaturan Anda) sering pergi ke
/var/log/cron
atau/var/log/syslog
.Jika perlu, Anda dapat memfilter pernyataan cron dengan mis
Sekarang kita telah membahas dasar-dasar cron, di mana file-file itu dan bagaimana menggunakannya, mari kita lihat beberapa masalah umum.
Periksa apakah cron sedang berjalan
Jika cron tidak berjalan maka perintah Anda tidak akan dijadwalkan ...
harus membuat Anda mendapatkan sesuatu seperti
atau
Jika tidak restart itu
atau
Mungkin ada metode lain; gunakan apa yang disediakan distro Anda.
cron menjalankan perintah Anda di lingkungan terbatas.
Variabel lingkungan apa yang tersedia cenderung sangat terbatas. Biasanya, Anda hanya akan mendapatkan beberapa variabel yang didefinisikan, seperti
$LOGNAME
,$HOME
, dan$PATH
.Dari catatan khusus
PATH
adalah terbatas pada/bin:/usr/bin
. Sebagian besar masalah "skrip cron saya tidak berfungsi" disebabkan oleh jalur terbatas ini . Jika perintah Anda berada di lokasi yang berbeda, Anda dapat menyelesaikan ini dalam beberapa cara:Berikan path lengkap ke perintah Anda.
Berikan PATH yang cocok di file crontab
Jika perintah Anda memerlukan variabel lingkungan lain, Anda juga dapat menentukannya di file crontab.
cron menjalankan perintah Anda dengan cwd == $ HOME
Terlepas dari di mana program yang Anda jalankan berada pada sistem file, direktori kerja program saat ini ketika cron menjalankannya adalah direktori home pengguna . Jika Anda mengakses file di program Anda, Anda harus mempertimbangkan ini jika Anda menggunakan jalur relatif, atau (lebih disukai) hanya menggunakan jalur yang sepenuhnya memenuhi syarat di mana-mana, dan menyimpan semua orang banyak kebingungan.
Perintah terakhir di crontab saya tidak berjalan
Cron umumnya mengharuskan perintah diakhiri dengan baris baru. Edit crontab Anda; pergi ke akhir baris yang berisi perintah terakhir dan masukkan baris baru (tekan enter).
Periksa format crontab
Anda tidak dapat menggunakan crontab pengguna yang diformat untuk / etc / crontab atau bagian-bagian di /etc/cron.d dan sebaliknya. Crontab yang diformat pengguna tidak menyertakan nama pengguna di posisi ke-6 berturut-turut, sementara crontab yang diformat sistem menyertakan nama pengguna dan menjalankan perintah sebagai pengguna.
Saya menaruh file di /etc/cron.{hourly ,daily ,weekly ,monthly} dan tidak berjalan
#!/bin/sh
di atas)Bug terkait tanggal Cron
Jika tanggal Anda baru-baru ini diubah oleh pengguna atau pembaruan sistem, zona waktu atau lainnya, maka crontab akan mulai berperilaku tidak menentu dan menunjukkan bug aneh, kadang-kadang berfungsi, kadang tidak. Ini adalah upaya crontab untuk mencoba "melakukan apa yang Anda inginkan" ketika waktu berubah dari bawahnya. Bidang "menit" akan menjadi tidak efektif setelah jam diubah. Dalam skenario ini, hanya tanda bintang yang akan diterima. Mulai ulang cron dan coba lagi tanpa terhubung ke internet (sehingga tanggal tidak memiliki kesempatan untuk mengatur ulang ke salah satu server waktu).
Tanda persen, lagi
Untuk menekankan saran tentang tanda persen, berikut adalah contoh apa yang dilakukan cron dengan mereka:
akan membuat file ~ / cron.out yang berisi 3 baris
Ini sangat mengganggu saat menggunakan
date
perintah. Pastikan untuk menghindari tanda persensumber
... /path/to/your/command >/tmp/mycommand.log 2>&1
sudo apt-get install postfix
Debian Linux dan turunannya (Ubuntu, Mint, dll) memiliki beberapa kekhasan yang dapat mencegah pekerjaan cron Anda dari mengeksekusi; khususnya, file-file di
/etc/cron.d
,/etc/cron.{hourly,daily,weekly,monthly}
harus:Yang terakhir sakit secara teratur pengguna yang tidak menaruh curiga; khususnya script di salah satu folder tersebut bernama
whatever.sh
,mycron.py
,testfile.pl
, dll akan tidak dieksekusi, pernah.Dalam pengalaman saya, poin khusus ini sejauh ini merupakan alasan yang paling sering untuk cronjob yang tidak mengeksekusi pada Debian dan turunannya.
Lihat
man cron
untuk lebih jelasnya, jika perlu.sumber
Jika cronjobs Anda berhenti berfungsi, periksa apakah kata sandi Anda belum kedaluwarsa, karena setelah itu, semua pekerjaan cron berhenti.
Akan ada pesan yang
/var/log/messages
mirip dengan yang di bawah ini yang menunjukkan masalah dengan mengautentikasi pengguna:sumber
sudo -u root passwd
Jadwal yang tidak biasa dan tidak teratur
Cron adalah semua hal yang dianggap sebagai penjadwal yang sangat mendasar dan sintaksis tidak dengan mudah memungkinkan administrator untuk merumuskan jadwal yang sedikit lebih jarang.
Pertimbangkan pekerjaan berikut yang biasanya akan dijelaskan untuk "berjalan
command
setiap 5 menit" :melawan:
yang tidak selalu berjalan
command
setiap 7 menit .Ingat bahwa /karakter dapat digunakan untuk memperkenalkan langkah tetapi langkah-langkah itu tidak membungkus di luar akhir seri misalnya
*/7
yang cocok dengan setiap menit ke-7 dari menit0-59
yaitu 0,7,14,21,28,35,42,49,49, 56 tetapi antara satu jam dan selanjutnya akan ada hanya 4 menit antara batch , setelah00:56
seri baru dimulai pada01:00
,01:07
dll (dan batch tidak akan berjalan pada01:03
,01:10
,01:17
dll).Apa yang harus dilakukan?
Buat banyak batch
Daripada pekerjaan cron tunggal, buat beberapa batch yang digabungkan menghasilkan jadwal yang diinginkan.
Misalnya untuk menjalankan batch setiap 40 menit (00:00, 00:40, 01:20, 02:00 dll.) Membuat dua batch, yang berjalan dua kali pada jam genap dan yang kedua yang hanya menjalankan jam ganjil:
Jalankan batch Anda lebih jarang
Daripada menjalankan batch Anda setiap 7 menit, yang merupakan jadwal yang sulit untuk dipecah dalam beberapa batch, jalankan saja setiap 10 menit.
Mulai batch Anda lebih sering (tetapi mencegah beberapa batch berjalan bersamaan)
Banyak jadwal aneh berkembang karena runtime batch meningkat / berfluktuasi dan kemudian batch dijadwalkan dengan sedikit margin keamanan tambahan untuk mencegah berjalannya batch yang sama dari tumpang tindih dan berjalan secara bersamaan.
Sebaliknya, pikirkan secara berbeda dan buat cronjob yang akan gagal dengan anggun ketika lari sebelumnya belum selesai, tetapi yang akan berjalan sebaliknya. Lihat T&J ini :
Itu hampir akan segera memulai menjalankan baru setelah menjalankan sebelumnya dari / usr / local / bin / frequent_cron_job telah selesai.
Mulai batch Anda lebih sering (tapi keluarlah dengan anggun ketika kondisinya tidak tepat)
Karena sintaks cron terbatas, Anda dapat memutuskan untuk menempatkan kondisi dan logika yang lebih kompleks dalam pekerjaan batch itu sendiri (atau dalam skrip pembungkus di sekitar pekerjaan batch yang ada). Itu memungkinkan Anda untuk memanfaatkan kapabilitas lanjutan dari bahasa skrip favorit Anda, mengomentari kode Anda dan akan mencegah konstruksi yang sulit dibaca di entri crontab itu sendiri.
Dalam bash maka
seven-minute-job
akan terlihat seperti sesuatu seperti:Yang kemudian Anda dapat dengan aman (mencoba) untuk menjalankan setiap menit:
Sebuah masalah yang berbeda, namun sama akan menjadwalkan batch untuk menjalankan pada hari Senin pertama setiap bulan (atau Rabu kedua) dll Cukup menjadwalkan batch untuk menjalankan setiap hari Senin dan keluar ketika tanggal yang tidak antara 1 st atau 7 th dan hari dalam seminggu bukan Senin.
Yang kemudian dapat Anda jalankan dengan aman (coba) setiap hari Senin:
Jangan gunakan cron
Jika kebutuhan Anda kompleks, Anda mungkin mempertimbangkan untuk menggunakan produk yang lebih maju yang dirancang untuk menjalankan jadwal yang rumit (didistribusikan di beberapa server) dan yang mendukung pemicu, ketergantungan pekerjaan, penanganan kesalahan, coba lagi dan coba lagi pemantauan dll. Jargon industri akan menjadi "perusahaan " penjadwalan pekerjaan dan / atau" otomatisasi beban kerja ".
sumber
Khusus PHP
Jika Anda memiliki beberapa pekerjaan cron seperti:
Dan dalam hal kesalahan mengharapkan, bahwa mereka akan dikirimkan kepada Anda, tetapi mereka tidak - periksa ini.
PHP secara default tidak mengirim kesalahan ke STDOUT. @lihat https://bugs.php.net/bug.php?id=22839
Untuk memperbaikinya, tambahkan cli`s php.ini atau di baris Anda (atau di bash wrapper Anda untuk PHP) ini:
Pengaturan ke-1 akan memungkinkan Anda memiliki karakter seperti 'Memory oops' dan ke-2 - untuk mengarahkan semuanya ke STDERR. Hanya setelah Anda dapat tidur nyenyak karena semua akan dikirim ke email root Anda, bukan hanya dicatat.
sumber
Menambahkan jawaban saya dari sini untuk kelengkapan, dan menambahkan sumber daya lain yang berpotensi membantu:
The
cron
pengguna memiliki yang berbeda$PATH
dari yang Anda lakukan:Masalah yang sering terjadi dengan
crontab
entri yang dibuat pengguna adalah mereka lupacron
menjalankan yang berbedaenvironment
dari yang mereka lakukan sebagai pengguna yang masuk. Misalnya, pengguna membuat program atau skrip di$HOME
direktori- nya , dan memasukkan perintah berikut untuk menjalankannya:Perintah berjalan dengan sempurna dari baris perintahnya. Pengguna kemudian menambahkan perintah itu ke miliknya
crontab
, tetapi ternyata ini tidak berhasil:Alasan kegagalan dalam hal ini
./
adalah karena lokasi yang berbeda untukcron
pengguna daripada untuk pengguna yang masuk. Artinya,environment
berbeda! PATH adalah bagian darienvironment
, dan biasanya berbeda untukcron
pengguna. Yang memperumit masalah ini adalahenvironment
forcron
tidak sama untuk semua distribusi * nix , dan ada beberapa versicron
Solusi sederhana untuk masalah khusus ini adalah untuk memberikan
cron
pengguna spesifikasi jalur lengkap dalamcrontab
entri:Apa itu
cron
penggunaenvironment
?Dalam beberapa kasus, kita mungkin perlu mengetahui
environment
spesifikasi lengkap untukcron
sistem kita (atau kita mungkin hanya ingin tahu). Apa gunanyaenvironment
bagicron
pengguna, dan apa bedanya dengan kami? Selanjutnya, kita mungkin perlu mengetahuienvironment
untukcron
pengguna lain -root
misalnya ... apa yangroot
penggunaenvironment
gunakancron
? Salah satu cara untuk mempelajari ini adalah memintacron
untuk memberi tahu kami:~/
) sebagai berikut (atau dengan editor pilihan Anda):/home/you/envtst.sh.out
. Output ini akan menunjukkan lingkungan Anda saat ini saat$USER
Anda masuk sebagai:crontab
untuk diedit:crontab
:JAWABAN: File keluaran
/home/you/envtst.sh.out
akan berisi daftarenvironment
untuk "pengguna root cron". Setelah Anda tahu itu, sesuaikancrontab
entri Anda sesuai.Saya tidak dapat menentukan jadwal yang saya butuhkan dalam
crontab
entri saya :Entri jadwal untuk
crontab
tentu saja didefinisikan dalamman crontab
, dan Anda harus membaca ini. Namun, membacaman crontab
, dan memahami jadwal adalah dua hal yang berbeda. Dan trial-and-error pada spesifikasi jadwal bisa menjadi sangat membosankan. Untungnya, ada sumber daya yang dapat membantu: guru crontab. . Masukkan spesifikasi jadwal Anda, dan itu akan menjelaskan jadwal dalam bahasa Inggris.Akhirnya, dan berisiko menjadi mubazir dengan salah satu jawaban lain di sini, jangan terjebak dalam pemikiran bahwa Anda terbatas pada satu
crontab
entri saja karena Anda memiliki satu pekerjaan untuk dijadwalkan. Anda bebas menggunakancrontab
entri sebanyak yang Anda butuhkan untuk mendapatkan jadwal yang Anda butuhkan.sumber