Saya memiliki skrip penerapan, harus menambahkan sesuatu ke pengguna crontab
(memicu skrip yang membersihkan log setiap XXX hari), namun ini hanya boleh dilakukan selama penerapan pertama, atau saat perlu diperbarui.
(Saya bisa lari xxx.py deploy env
atau xxx.py update env
)
jadi saya harus melakukan ini:
Check if my cronJob already exist
Put my cronJob if it does not already exist
or
update my cronjob if one of the parameter of the command is different
Saya tidak melihat cara menambah / memeriksa / menghapus sesuatu crontab
tanpa menggunakan crontab -e
atau mengedit crontab
file (unduh, tulis ulang, unggah kembali)
PS: ini adalah cronjob khusus pengguna, "webadmin" akan melakukannya dan ia tidak boleh menggunakan sudo untuk melakukannya.
/etc/cron.d
? Jika demikian, letakkan skrip Anda di sana menggunakan nama yang unik untuk aplikasi Anda/etc/crontab
, file dalam/etc/cron.d/
memiliki bidang tambahan untuk nama pengguna, segera setelah spesifikasi jadwal. mis* * * * * username /path/to/script
. Lihatman 5 crontab
dan cariSYSTEM CRON
.Jawaban:
ide terbaik saya sejauh ini
untuk memeriksa dulu apakah konten cocok dengan apa yang seharusnya ada di sana dan hanya memperbarui jika tidak:
tetapi ini menjadi cukup rumit untuk membangun skrip terpisah di sekitar tugas cron itu.
ide lain
Anda dapat mengirim string melalui stdin ke crontab (berhati-hatilah, ini menghapus semua entri crontab sebelumnya):
ini bahkan harus bekerja melalui ssh:
jika Anda ingin menambahkan file Anda dapat menggunakan ini:
sumber
echo '*...
memperluas*
ke daftar file. 2) ujung baris di crontab terhapus.echo "*...
dan 2) hapusecho $
dari awal baris.Sebagai catatan saya akan menyarankan menggunakan
/etc/cron.d/
. Hanya root yang dapat menulis file di sini tetapi entri dapat dijalankan sebagai pengguna mana pun (tanpa perlusudo
).Ini dapat diterapkan beberapa kali, memperbarui
webadmin.cron
file lokal seperlunya sebelum menyalinnya.Anda bahkan dapat menghapus ketentuan:
Perhatikan bahwa dalam banyak kasus Anda tidak dapat memberikan kata sandi root untuk perintah
scp
/ssh
. Alih-alih, Anda harus menyiapkan sertifikat kunci publik / pribadi. Juga, dengan implikasi akun lokal (apa pun itu) akan memiliki akses root penuh ke server jarak jauh. Tidak jelas pada saat ini apakah itu akan menjadi show-stopper untuk skenario spesifik Anda.sumber
/etc/cron.d/
ada persis untuk tujuan ini - sehingga paket / penyebaran hanya bisa meletakkan file crontab di sini.Saya sangat merekomendasikan menggunakan Ansible * untuk ini daripada menggulirkan sendiri. Atau Boneka atau Koki - tetapi Ansible sangat cocok untuk skrip penerapan tanpa infrastruktur seperti ini.
Itu karena sudah ada modul yang dimaksudkan untuk menyelesaikan masalah seperti ini, dan alat-alat manajemen konfigurasi telah memiliki idempotensi sebagai tujuan desain dasar - itu adalah properti hanya berubah ketika perlu bahkan jika Anda secara tidak sengaja (atau sengaja) menjalankannya lagi.
Secara khusus, modul cron Ansible dapat memodifikasi crontab pengguna. Sebagai bonus, jika Anda ingin menyesuaikan kemudian menggunakan crontab sistem, itu akan menjadi tweak yang sangat mudah daripada menulis ulang.
* Penafian: Saya bekerja untuk Red Hat, dan Ansible adalah proyek yang disponsori Red Hat.
sumber
Jika Anda ingin menambahkan pekerjaan cron melalui akun target, jalankan
crontab -e
. Perintah ini melewati crontab melalui editor. Katakan untuk menggunakan perintah editor yang memodifikasi crontab sesuai keinginan Anda. Perintah editor dieksekusi sebagai potongan shell dengan nama file sementara ditambahkan.Pendekatan ini lebih dapat diandalkan daripada yang asli
crontab -l | … | crontab -
karena yang ini rentan terhadap kondisi ras jika crontab diedit secara bersamaan: modifikasi yang dibuat antara panggilan kecrontab -l
dan panggilan kecrontab -
akan dibatalkan.sumber
Ini adalah adaptasi dari apa yang ditawarkan @ phillip-zyan-k-lee-stockmann , berdasarkan kode "Ide terbaik sejauh ini".
Perubahan saya dari cuplikannya (sangat baik dan bermanfaat) pada dasarnya:
Dan inilah kode saya untuk apa yang saya sebut
crontab-add-hourly.sh
:Contoh penggunaan dan output:
sumber
TL; DR: Ini benar-benar berfungsi, diuji dalam Bash 4.4.
Sebagaimana dicatat dalam komentar jawaban @Phillip -Zyan K Lee- Stockmann, solusi itu mengembang
*
ke semua file di direktori saat ini. Saya tidak bisa mendapatkan saran komentar untuk bekerja. set -f menonaktifkan ekspansi wildcard, lihat https://stackoverflow.com/a/11456496/915441 .sumber