HARAP DICATAT : Saya telah membaca semua pertanyaan serupa kembali. cron, paths, env variabel dan sebagainya, tetapi tidak menemukan satupun yang menawarkan solusi untuk masalah khusus saya.
Saya memiliki skrip yang membuat beberapa dump MySQL dan kemudian menghapus yang lama seperti ini:
/usr/bin/find "/home/bkp/dbdump" -name "*.gz" -mtime +5 -delete
( perintah di atas telah dimodifikasi dari perintah asli saya dengan saran dari komentar )
Namun, file tidak pernah dihapus ketika cron menjalankan skrip ini. Pengguna cron adalah root.
Catatan debugging
Jika saya menjalankan skrip secara manual di mana perintah muncul, itu menghapusnya seperti yang diharapkan.
Jika saya menjalankan perintah find di atas sendiri dari baris perintah sebagai root, ia menghapusnya seperti yang diharapkan (dan dengan -cetak ia mengembalikan daftar file yang lebih lama dari 5 hari seperti yang diharapkan)
Saya juga menambahkan pernyataan path eksplisit ke crontab root, tapi
itu tidak mengubah apa pun.Cron tidak mengirim kesalahan, dan jika saya mem-pipe operasi find ke file log,
yang muncul kosong atau tidak dibuat sama sekali.Saya menggunakan server Ubuntu 14.04.03 LTS.
/usr/bin/find /home/bkp/dbdump/*.gz -mtime +5
cron
perintah dijalankan melalui shell, dan shell memperluas wildcard.cron
harus mengirim email dengan pesan kesalahan dan keluaran. Apakah Anda mendapatkan email seperti itu dari pekerjaan ini?Jawaban:
Masalahnya adalah bahwa
crontab
itu tidak$PATH
diatur saat dijalankan. Anda benar-benar dapat menyediakannya dengan jalur dengan menambahkan ini ke bagian atas file yang dibuka melaluicrontab -e
:(atau apa pun yang
PATH
Anda inginkan untuk digunakan). Ini berarti Anda dapat menghindari menentukan path lengkap ke perintah, langsung dari cron.Ada beberapa masalah dengan perintah asli Anda. Anda pada dasarnya meminta shell untuk melakukan ekspansi wildcard, bukan
find
. Kedua, Anda tidak menyediakan jalur lengkap untukrm
; gunakan/bin/rm
atau/usr/bin/rm
, di mana pun ia berada di sistem Anda (lihatwhich rm
).Argumen pertama untuk menemukan adalah "lokasi untuk mencari", dan kemudian Anda menentukan "permintaan pencarian" dengan berbagai
-<option>
s. Jadi, format yang tepat dari perintah yang ingin Anda jalankan adalah:atau
Jika Anda tidak menentukan
PATH
definisi seperti di atas, gunakan:atau
sumber
$PATH
diatur, tetapi itu akan menjadi standar sistem. Ini akan termasuk/usr/bin
dan/bin
, jadi itu harus dapat menemukanrm
perintah.Coba ini sebagai gantinya
sumber
-maxdepth 1
.Jika saya memohon perintah find langsung dari crontab root dan bukan sebagai bagian dari skrip, maka itu berfungsi.
Script yang dimaksud menggunakan csh. Saya percaya bahwa lingkungan cron root pada Ubuntu akan menggunakan / bin / bash (atau / bin / dash?). Mungkin ini bertentangan dengan cara bagaimana perintah find dijalankan.
Apa pun itu, masalah utama yang dipecahkannya, meski agak tidak hati-hati.
sumber