Perbedaan antara menggunakan crontab dan /etc/cron.hourly, setiap hari, setiap minggu

12

Saya memiliki skrip terjadwal yang melakukan backup svnsync setiap jam dari repositori Subversion kami. Saya menjalankannya dari entri di root crontab tanpa masalah, tetapi memutuskan saya ingin menjalankannya dari /etc/cron. Lebih baik untuk visibilitas tambahan (dan karena salah satu teknisi kami tidak sengaja menghapus crontab karena dia pikir "crontab -r "berarti" baca crontab ;-))

Perintah svnsync di skrip cron. Setiap hari gagal dengan pesan yang mengatakan bahwa sertifikat SSL untuk repositori SVN harus diterima (ini adalah pesan yang Anda dapatkan secara interaktif saat pertama kali pengguna mengakses repositori SVN, tetapi begitu sertifikat I menerima pesan tidak muncul lagi).

Jadi sepertinya bagi saya bahwa skrip dieksekusi di bawah lingkungan pengguna yang berbeda ketika dijalankan dari cron. Lebih baik daripada ketika dijalankan melalui root crontab. Adakah yang bisa menjelaskan perbedaannya?

UPDATE: Seharusnya saya menyebutkan distro saya, saya menggunakan anacron pada CentOS 5.1.

UPDATE 2: Terima kasih atas sarannya sejauh ini; Saya pikir ini berubah menjadi pertanyaan Subversion. Saya selalu mencoba merangkum lingkungan saya ke dalam skrip saya, tetapi masalahnya di sini adalah saya tidak yakin apa itu di (atau kurang) lingkungan yang membuat SVN meminta sertifikat SSL untuk diterima ketika saya menjalankan skrip saya dari cron. Saya menduga itu ada hubungannya dengan cara menjalankan skrip run-parts.

gareth_bowles
sumber
1
Akan bermanfaat untuk menyertakan paket pilihan distro dan cron Anda.
Dan Carley

Jawaban:

4

Anda ingin menggunakan opsi '--config-dir' untuk memberi tahu tempat menemukan sertifikat yang diterima (mis. ~ / .Subversion secara default).

Yang mengatakan, saya hampir yakin Anda akan lebih baik memanggil svnsync dari skrip hook / post-commit sebagai gantinya, seperti yang disarankan di tempat lain . Maka cermin Anda selalu sinkron, bukan sinkron dengan tempat tuanmu satu jam yang lalu.

James Cape
sumber
16

Pada sistem Debian / Ubuntu cron.daily | mingguan | bulanan dimulai dari crontab utama.

17 *    * * *   root    cd / && run-parts --report /etc/cron.hourly
25 6    * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6    * * 7   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6    1 * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )

Juga perlu diingat bahwa Anda mungkin dapat menempatkan fragmen crontab di /etc/cron.d/

Seperti yang Anda lihat, tidak ada sesuatu yang khusus tentang lingkungan ini. Setidaknya pada Debian / Ubuntu semuanya dijalankan sebagai akun root.

Ketika saya menulis skrip cron di bagian paling awal skrip saya selalu mengatur PATH saya dan variabel lingkungan lainnya yang akan saya gunakan, jadi saya bisa yakin itu akan bekerja dengan benar di lingkungan apa pun.

Sakit kepala
sumber
6

Crontab seluruh sistem reguler adalah crontab pengguna tertentu dan memiliki bidang nama pengguna, seperti yang digunakan oleh /etc/crontab.

Menggunakan skrip dalam /etc/cron.*(jam, harian, mingguan, bulanan) adalah cara yang lebih bersih dan mudah (mencegah kesalahan sintaksis yang umum) dalam mengkonfigurasi crontab untuk rootpengguna dan ini ditangani dengan run-partsmenjalankan skrip atau program dalam direktori. Semua aturan ini masih didefinisikan dalam sistem-lebar crontab secara default ( /etc/crontab), jadi itu adalah hal yang sama.

Ketika pekerjaan cron ditangani oleh run-parts, lebih mudah untuk di-debug, karena Anda cukup menguji skrip mana yang akan dijalankan secara tepat (tanpa menjalankannya) dengan:

sudo run-parts --report --test /etc/cron.daily
kenorb
sumber
3

Tebakan liar pertama saya akan memeriksa variabel HOME Anda.

Pada sistem Centos saya, man 5 crontab mengatakan:

Beberapa variabel lingkungan diatur secara otomatis oleh daemon cron (8). SHELL diatur ke / bin / sh, dan LOGNAME dan HOME diatur dari baris / etc / passwd dari pemilik crontab.

Jadi, jika Anda belum menentukan sebaliknya, crontab root akan menggunakan / root untuk HOME. Tetapi di / etc / crontab (yang merupakan tempat /etc/cron.hour dijalankan dari, melalui run-parts), HOME diatur ke / (dan SHELL ke / bin / bash alih-alih / bin / sh).

Saya tidak tahu tentang svnsync, tetapi subversi menggunakan direktori ˜ / .subversion /, jadi itu bisa bergantung pada HOME.

Marie Fischer
sumber
3

Pada sistem RHEL 5.1 saya, variabel lingkungan PATH diatur dari / etc / crontab. Semua hal di atas adalah hal-hal yang dimasukkan ke lingkungan.

Jika Anda me-restart cron, maka pertama kali dijalankan (jika dari /etc/crontabatau /var/spool/cron/$USER) ia akan mencatatnya di / var / log / cron. Kalau tidak, itu hanya akan mencatat bahwa cron.hourly berlari

Crontab saya diatur sebagai berikut:

01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly

Yang bisa Anda lakukan adalah memasukkan sesuatu seperti berikut ke /etc/cron.hourly:

env > /tmp/cron.env

Kemudian periksalah file tersebut ketika ada, dan apakah memodifikasi skrip Anda (jika Anda bisa) untuk mengatur lingkungan dengan benar, atau menulis skrip pembungkus pendek yang akan dipanggil oleh crontab Anda.

Kevin M.
sumber
2

/var/log/messages (atau yang setara dengan distro Anda) harus memberi tahu Anda secara spesifik perintah apa yang dijalankan kapan dan sebagai pengguna mana.

Dan Carley
sumber
2

Jangan pernah berasumsi ada sesuatu di lingkungan. Selalu pertahankan kode. Anda memiliki seluruh file untuk meletakkan lingkungan apa pun yang mengatur hal-hal yang Anda inginkan di sana. Gunakan.

Rory
sumber
2

Tidak terlalu mudah dibawa, terakhir kali saya memeriksa (di Debian) disarankan untuk meletakkan barang di cron.hourly (dan yang lainnya) dan tidak langsung ke crontab jika Anda ingin membuat paket dengan barang-barang Anda.

Johan
sumber