Pekerjaan cron harian tidak berjalan

10

Tinjauan singkat: Saya memiliki skrip yang akan mencadangkan setiap hari repositori kode sumber saya dari SVN ke tarball untuk hari itu. Saya telah menguji skrip dan berfungsi dengan baik selama saya menjalankannya sebagai sudo, karena kepemilikan direktori keluaran.

Jadi masalahnya adalah saya ingin menjalankan ini setiap hari, jadi saya menaruh tautan di direktori /etc/cron.daily. Berikut adalah isi direktori.

thom@spenser:/etc/cron.daily$ ls -l
total 60
-rwxr-xr-x 1 root root   189 2011-09-14 02:21 apport
-rwxr-xr-x 1 root root 15535 2011-10-06 11:30 apt
-rwxr-xr-x 1 root root   314 2011-08-08 16:57 aptitude
lrwxrwxrwx 1 root root    24 2012-02-28 11:05 backup -> /usr/local/bin/backup.sh
-rwxr-xr-x 1 root root   502 2011-06-08 11:48 bsdmainutils
-rwxr-xr-x 1 root root   256 2011-10-06 04:04 dpkg
-rwxr-xr-x 1 root root   372 2011-10-04 16:50 logrotate
-rwxr-xr-x 1 root root  1353 2011-07-27 07:17 man-db
-rwxr-xr-x 1 root root   606 2011-08-17 09:16 mlocate
-rwxr-xr-x 1 root root   249 2011-06-24 05:36 passwd
-rwxr-xr-x 1 root root  2417 2011-07-01 17:25 popularity-contest
-rwxr-xr-x 1 root root   383 2011-09-30 15:09 samba
-rwxr-xr-x 1 root root  3594 2011-09-19 20:07 standard
thom@spenser:/etc/cron.daily$ 

Masalahnya adalah itu tidak pernah berjalan. Berikut adalah izin untuk skrip itu:

thom@spenser:/etc/cron.daily$ ls -l /usr/local/bin/backup.sh 
-rwxr-xr-x 1 root root 260 2012-02-28 11:03 /usr/local/bin/backup.sh

Ide ide?

Thom
sumber
2
Jika memungkinkan, harap pertimbangkan untuk menutup beberapa pertanyaan terbuka Anda lainnya dengan memilih jawaban terbaik (jika ada). Kami membutuhkan pengguna untuk mempertahankan pertanyaan mereka sehingga situs dapat menjadi alat yang efektif untuk orang berikutnya dengan masalah Anda. Untuk detail lebih lanjut tentang praktik terbaik, pertimbangkan membaca FAQ tentang mengajukan pertanyaan .
Bruno Pereira

Jawaban:

37

Sudah mencoba ini

run-parts --test /etc/cron.daily

Ternyata file update.ubuntu saya tidak muncul. Juga perhatikan bahwa file saya memiliki ekstensi (memiliki titik di dalamnya).

Langkah-langkah untuk memperbaikinya.

  1. Mengganti nama pembaruan saya.ubuntu menjadi pembaruan-ubuntu
  2. Sekarang lagi run-parts --test /etc/cron.daily, kali ini file saya muncul!
D Durga Prasad
sumber
1
Ya, ini memperbaikinya untuk saya. Itu tidak suka titik-titik dalam nama file, mengubah nama file saya dari myscript.sh ke myscript bekerja untuk saya.
Matt Parkins
3
Ini harus lebih tinggi. Saya telah menyimpan skrip saya sebagai "backup.sh" tradisional. Menghapus bagian ".sh" menyelesaikannya. Terima kasih banyak!
David
Terima kasih! Cowok / cewek yang memutuskan untuk secara implisit menghapus file .sh dari cron harian harus dipermalukan!
Sylvain
Harus dicambuk di depan umum! ;-) Saya bertanya-tanya berapa banyak waktu yang hilang secara kolektif karena keputusan ini ... Saya juga bertanya-tanya apakah ada alasan bagus untuk itu?
xastor
3

Bisa jadi satu dari beberapa hal:

Jalur root:

Bergantung pada perintah yang dijalankan, Anda mungkin perlu memperluas variabel PATH pengguna root dengan meletakkan baris berikut di bagian atas file crontab mereka:

PATH = / usr / sbin: / usr / bin: / sbin: / bin

src: https://help.ubuntu.com/community/CronHowto

Atau cukup gunakan jalur lengkap untuk setiap perintah dalam skrip Anda: /bin/lsalih-alih lsmisalnya. ( which lsdi baris perintah untuk jalur).

Ada bug aneh tentang titik-titik dalam nama file yang dilaporkan di sini . Mungkin memperluas ke file yang Anda tautkan, meskipun ini tampaknya tidak mungkin.

Apakah Anda menyimpan output dari file cadangan? Letakkan sesuatu seperti ini di baris pertama, untuk membantu menentukan apakah itu tidak berjalan sama sekali atau berjalan tetapi gagal di beberapa titik.

/bin/echo "Attempting to run backup" >> /path-to-home/backup.log

Atau coba tambahkan skrip ke file crontab secara langsung:

sudo -i
crontab -e
[add the next line to the file, then save and exit]
33 15 * * * /usr/local/bin/backup.sh

akan berjalan pada pukul 15:30 setiap hari jika mesin hidup. gunakan * * * * * saat pengujian untuk berjalan satu menit sekali sampai Anda membuatnya berfungsi.

Sean
sumber
1
Tidak disarankan menggunakan jalur absolut dalam skrip. Jika Anda tidak tahu apa PATH itu, atur sendiri dalam skrip. Lihat Alasan mengapa crontab tidak berfungsi
geirha
Tautan yang bermanfaat, terima kasih. Alasan yang diberikan untuk tidak menggunakan path lengkap adalah portabilitas. Cukup adil. Solusi masuk akal lainnya adalah dengan menentukan perintah yang Anda gunakan di awal skrip, bersama dengan konfigurasi lain: LS = / bin / ls; SRC_DIR = / home / joe / src. Kemudian gunakan $ LS $ SRC_DIR. Menyimpan segala sesuatu di atas dan di satu tempat.
Sean
Saya menemukan bahwa untuk mengurangi keterbacaan, dan Anda harus memeriksa setiap PERINTAH = / path / ke / perintah untuk setiap sistem baru yang harus dijalankan. Pada satu sistem, semua perintah yang Anda butuhkan bisa berada di / usr / bin, yang lain ada di / bin, yang lain di / usr / bin. Hanya memiliki kedua / usr / bin dan / bin di PATH menjadikan itu tidak masalah. Di samping catatan, nama variabel harus huruf kecil, kalau tidak Anda berisiko mengabaikan variabel shell khusus atau variabel lingkungan.
geirha
re: nama variabel huruf besar. Saya selalu melakukan itu tanpa banyak berpikir, karena skrip pertama yang saya lihat melakukannya. Tapi Anda benar, tidak ada sisi positif dan peluang penurunan. Terima kasih telah menunjukkan ini, hentikan kebiasaan ini sekarang.
Sean
1

Grep syslog Anda untuk pesan seperti;

crond: (*system*) BAD FILE MODE

file perlu dibatasi hingga (mencukupi) di 644):

chmod 0644 /etc/cron.d/my_crontab
Tom H
sumber