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.
Jawaban:
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.
sumber
Pada sistem Debian / Ubuntu cron.daily | mingguan | bulanan dimulai dari crontab utama.
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.
sumber
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 untukroot
pengguna dan ini ditangani denganrun-parts
menjalankan 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:sumber
Tebakan liar pertama saya akan memeriksa variabel HOME Anda.
Pada sistem Centos saya, man 5 crontab mengatakan:
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.
sumber
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/crontab
atau/var/spool/cron/$USER
) ia akan mencatatnya di / var / log / cron. Kalau tidak, itu hanya akan mencatat bahwa cron.hourly berlariCrontab saya diatur sebagai berikut:
Yang bisa Anda lakukan adalah memasukkan sesuatu seperti berikut ke /etc/cron.hourly:
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.
sumber
/var/log/messages
(atau yang setara dengan distro Anda) harus memberi tahu Anda secara spesifik perintah apa yang dijalankan kapan dan sebagai pengguna mana.sumber
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.
sumber
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.
sumber