Bagaimana memperbaiki semua masalah / masalah terkait crontab Anda (Linux)
Ini adalah wiki komunitas , jika Anda melihat ada yang salah dengan jawaban ini atau memiliki informasi tambahan, silakan edit.
Pertama, terminologi dasar:
- cron (8) adalah daemon yang menjalankan perintah yang dijadwalkan.
- crontab (1) adalah program yang digunakan untuk memodifikasi file pengguna crontab (5).
- crontab (5) adalah file per pengguna yang berisi instruksi untuk cron (8).
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 bernama cron.deny
yang akan menentukan pengguna mana yang tidak dapat menggunakan cron. Lokasi cron.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
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7)
# | | | | |
# * * * * * command to be executed
Sistem luas /etc/crontab
dan /etc/cron.d
fragmen
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7)
# | | | | |
# * * * * * user-name command to be executed
Perhatikan 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.
- Bidang dipisahkan oleh spasi atau tab.
- Tanda koma (
,
) digunakan untuk menentukan daftar, misalnya 1,4,6,8 yang berarti dijalankan pada 1,4,6,8.
- Rentang ditentukan dengan tanda hubung (
-
) dan dapat digabungkan dengan daftar misalnya 1-3,9-12 yang berarti antara 1 dan 3 kemudian antara 9 dan 12.
- The
/
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.
- Tanda bintang (
*
) di bidang menandakan seluruh rentang untuk bidang itu (misalnya 0-59
untuk bidang menit).
- Rentang dan langkah dapat digabungkan misalnya
*/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
MAILTO=user@somehost.tld
1 2 * * * /path/to/your/command
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
:
1 2 * * * /path/to/your/command &>/tmp/mycommand.log
1 2 * * * /path/to/your/command >/tmp/mycommand.log 2>&1
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
grep CRON /var/log/syslog
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 ...
ps -ef | grep cron | grep -v grep
harus membuat Anda mendapatkan sesuatu seperti
root 1224 1 0 Nov16 ? 00:00:03 cron
atau
root 2018 1 0 Nov14 ? 00:00:06 crond
Jika tidak restart itu
/sbin/service cron start
atau
/sbin/service crond start
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.
1 2 * * * /path/to/your/command
Berikan PATH yang cocok di file crontab
PATH=/usr:/usr/bin:/path/to/something/else
1 2 * * * command
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
- Pastikan nama file tidak memiliki ekstensi lihat run-parts
- Pastikan file telah menjalankan izin.
- Beri tahu sistem apa yang akan digunakan ketika menjalankan skrip Anda (mis. Diletakkan
#!/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:
# cron entry
* * * * * cat >$HOME/cron.out%foo%bar%baz
akan membuat file ~ / cron.out yang berisi 3 baris
foo
bar
baz
Ini sangat mengganggu saat menggunakan date
perintah. Pastikan untuk menghindari tanda persen
* * * * * /path/to/command --day "$(date "+\%Y\%m\%d")"