Bagaimana cara membuat pekerjaan cron menggunakan Bash secara otomatis tanpa editor interaktif?
395
Apakah crontab memiliki argumen untuk membuat pekerjaan cron tanpa menggunakan editor (crontab -e). Jika demikian, Apa yang akan menjadi kode membuat cronjob dari skrip Bash?
Sayangnya, sebagian besar jawaban teratas di sini hanya menunjukkan cara memodifikasi crontab - meskipun dengan cara yang cukup aman - tapi saya pikir secara keseluruhan pendekatan yang salah. Lebih baik, lebih aman dan lebih sederhana adalah dengan memasukkan file ke {{cron.d}}, dan ada (saat ini) jawaban dengan suara rendah yang menjelaskan bagaimana melakukan itu jika Anda melihat lebih jauh.
gregmac
Jawaban:
539
Anda dapat menambahkan ke crontab sebagai berikut:
#write out current crontab
crontab -l > mycron
#echo new cron into cron file
echo "00 09 * * 1-5 echo hello">> mycron
#install new cron file
crontab mycron
rm mycron
Penjelasan garis cron
*****"command to be executed"-----|||||||||-----Day of week (0-7)(Sunday=0 or 7)|||-------Month(1-12)||---------Day of month (1-31)|-----------Hour(0-23)-------------Minute(0-59)
(crontab -l ; echo "00 09 * * 1-5 echo hello") | crontab -- lebih mudah untuk menyalin
jawaban
8
Saya sarankan untuk mengubahnya ;dengan &&sebagai penjaga keamanan terhadap kasus ini jika crontab -lgagal. jadi, seperti:(crontab -l && echo "0 0 0 0 0 some entry") | crontab -
MacUsers
12
@MacUsers, crontab -lgagal jika tidak ada crontab, jadi menggunakan &&skrip tidak mungkin untuk menambahkan entri pertama ke crontab.
crontab -ldaftar pekerjaan crontab saat ini, catmencetaknya, echomencetak perintah baru dan crontab -menambahkan semua barang yang dicetak ke dalam file crontab. Anda dapat melihat efeknya dengan melakukan yang baru crontab -l.
terima kasih, bisakah Anda menjelaskan sintaks, atau menunjuk ke url yang menjelaskannya?
situs
9
crontab -ldaftar pekerjaan crontab saat ini, catmencetaknya, echomencetak perintah baru dan crontab -menambahkan semua barang yang dicetak ke dalam file crontab. Anda dapat melihat efeknya dengan melakukan yang barucrontab -l
nha
3
Bekerja untukku. Jika pengguna tidak memiliki crontab yang ada, Anda akan melihat no crontab for <username>, tetapi tetap berfungsi.
@moeseth: Saya jelas mencobanya di komputer saya (linux). Saya tidak akan menyarankan hal-hal yang tidak bekerja secara acak: /
MoonCactus
2
Omong-omong, 27 orang tidak mungkin salah (sampai hari ini). Jadi tolong jelaskan mengapa itu tidak berfungsi untuk pengaturan Anda, jadi kami dapat membantu.
MoonCactus
2
Mungkin masalah OSX.
moeseth
40
Terima kasih semuanya atas bantuan Anda. Menyatukan apa yang saya temukan di sini dan di tempat lain saya datang dengan ini:
Saya tidak tahu bagaimana cara menghilangkan kebutuhan untuk dua variabel tanpa mengulangi sendiri.
commandjelas merupakan perintah yang ingin saya jadwalkan. jobmengambil $commanddan menambahkan data penjadwalan. Saya membutuhkan kedua variabel secara terpisah di baris kode yang berfungsi.
Detail
Credit to duckyflip, saya menggunakan redirect thingy ( <(*command*)) ini untuk mengubah output crontab -lmenjadi input untuk fgrepperintah.
fgrepkemudian memfilter kecocokan $command( -vopsi), tidak peka huruf besar-kecil ( -iopsi).
Sekali lagi, redirect thingy ( <(*command*)) digunakan untuk mengubah hasilnya kembali menjadi input untuk catperintah.
The catperintah juga menerima echo "$job"(self explanatory), sekali lagi, melalui penggunaan thingy redirect ( <(*command*)).
Jadi keluaran yang difilter dari crontab -ldan yang sederhana echo "$job", digabungkan, disalurkan ('|') ke crontab -untuk akhirnya ditulis.
Dan mereka hidup bahagia selama lamanya!
Pendeknya:
Baris kode ini menyaring semua pekerjaan cron yang cocok dengan perintah, kemudian menulis pekerjaan cron yang tersisa dengan yang baru, secara efektif bertindak seperti fungsi "tambah" atau "perbarui". Untuk menggunakan ini, yang harus Anda lakukan adalah menukar nilai untuk commanddan jobvariabel.
Untuk manfaat membaca orang lain, keuntungan dari pendekatan ini adalah Anda dapat menjalankannya beberapa kali tanpa khawatir tentang entri duplikat di crontab (tidak seperti semua solusi lain). Itu karenafgrep -v
aleemb
5
Jika Anda lebih suka cara piping kiri-ke-kanan yang tradisional, ganti baris terakhir dengan: crontab -l | fgrep -i -v "$command" | { cat; echo "$job"; } | crontab -l
Antoine Lizée
1
@ AntoineLizée, Anda menjawab memiliki "l" tambahan pada akhirnya, yang seharusnya tidak ada di sana.
Dalam contoh di atas, kami membuat file di /etc/cron.d/, menyediakan variabel lingkungan untuk perintah untuk mengeksekusi berhasil, dan menyediakan useruntuk perintah, dan commanditu sendiri. File ini seharusnya tidak dapat dieksekusi dan namanya hanya boleh mengandung alfanumerik dan tanda hubung (lebih detail di bawah).
Untuk memberikan jawaban yang menyeluruh, mari kita lihat perbedaan antara crontabvs cron/crond:
crontab -- maintain tables for driving cron for individual users
Bagi mereka yang ingin menjalankan pekerjaan dalam konteks pengguna mereka pada sistem, menggunakan crontabmungkin masuk akal.
cron -- daemon to execute scheduled commands
Bagi mereka yang menggunakan manajemen konfigurasi atau ingin mengelola pekerjaan untuk pengguna lain, dalam hal ini kita harus menggunakan cron.
Kutipan cepat dari halaman manual memberi Anda beberapa contoh tentang apa yang harus dan tidak harus dilakukan:
/ etc / crontab dan file-file di /etc/cron.d harus dimiliki oleh root, dan tidak boleh ditulis kelompok atau lainnya. Berbeda dengan area spool, file di bawah /etc/cron.d atau file di bawah /etc/cron.hourly, /etc/cron.daily, /etc/cron.weekly dan /etc/cron.monthly juga mungkin symlink, dengan ketentuan bahwa symlink dan file yang ditunjuknya dimiliki oleh root. File-file di bawah /etc/cron.d tidak perlu dieksekusi, sedangkan file-file di bawah /etc/cron.hourly, /etc/cron.daily, /etc/cron.weekly dan /etc/cron.bulan lakukan, seperti mereka dijalankan oleh run-parts (lihat run-parts (8) untuk informasi lebih lanjut).
Masih sh: 1: Syntax error: "(" unexpectedmenggunakan sh .
Batandwa
Ini hanya berfungsi jika Anda menggunakan BASH. Saya tidak mengetahui sintaks DASH (sh) yang benar. Memperbarui jawabannya juga
kvz
1
fwiw, saya mendapatkan kesalahan ini menggunakan bash jika ada ruang antara <dan (. Itu berarti < (gagal tetapi <(berfungsi, kecuali ada tanda bintang di jadwal Anda ...
doublesharp
Saya percaya ini adalah cara yang benar:cat <(crontab -l |grep -v "${CRON}") <(echo "${CRON}") | crontab -
Stanislav
5
Untuk pembuatan / penggantian crontab dari dengan skrip BASH yang cepat dan kotor, saya menggunakan notasi ini:
Jika Anda menggunakan Vixie Cron, mis. Pada sebagian besar distribusi Linux, Anda cukup meletakkan file di /etc/cron.d dengan masing-masing cronjob.
Ini hanya berfungsi untuk root saja. Jika sistem Anda mendukung ini, Anda akan melihat beberapa contoh di sana. (Catat nama pengguna yang disertakan dalam baris, dalam sintaksis yang sama dengan yang lama / etc / crontab)
Ini adalah kesalahan yang menyedihkan di cron bahwa tidak ada cara untuk menangani hal ini sebagai pengguna biasa, dan begitu banyak implementasi cron tidak memiliki cara sama sekali untuk menangani hal ini.
sudo - karena Anda memerlukan hak yang lebih tinggi untuk mengubah konfigurasi cron di bawah direktori / etc
gema - kendaraan untuk membuat output pada std out. printf, cat ... akan bekerja juga
"- gunakan doublequote di awal string Anda, Anda seorang profesional
0,15,30,45 * * * * - jadwal lari cron standar, ini berjalan setiap 15 menit
ntpdate -u time.nist.gov - perintah aktual yang ingin saya jalankan
"- karena tanda kutip ganda pertama saya membutuhkan seorang teman untuk menutup garis yang sedang diproduksi
>> - pengalihan dua kali lipat alih-alih menimpa *
/etc/cron.d/vmclocksync - vmclocksync adalah nama file yang saya pilih, ia berada di /etc/cron.d/
* jika kami menggunakan> redirect, kami dapat menjamin bahwa kami hanya memiliki satu entri tugas. Tapi, kita berisiko membuang aturan lain dalam file yang ada. Anda dapat memutuskan sendiri apakah kemungkinan penghancuran dengan> benar atau kemungkinan duplikat dengan >> adalah untuk Anda. Atau, Anda dapat melakukan sesuatu yang berbelit-belit atau terlibat untuk memeriksa apakah nama file ada, jika ada sesuatu di dalamnya, dan apakah Anda menambahkan jenis duplikat - tetapi, saya memiliki beberapa hal untuk dilakukan dan saya tidak dapat melakukannya untuk kamu sekarang
Skrip Bash untuk menambahkan pekerjaan cron tanpa editor interaktif. Kode di bawah ini membantu menambah cronjob menggunakan file linux.
#!/bin/bash
cron_path=/var/spool/cron/crontabs/root
#cron job to run every 10 min.
echo "*/10 * * * * command to be executed">> $cron_path
#cron job to run every 1 hour.
echo "0 */1 * * * command to be executed">> $cron_path
Saya tahu ini waktu yang sangat lama, tetapi ini masih satu-satunya jawaban yang baik, karena semua yang paling banyak memilih menghapus crons lama daripada hanya menambahkan yang baru.
afe
1
Yang ini tidak menginstal cron. Itu hanya menambahkannya ke file. Anda harus memberitahukan proses cron untuk menginstal entri baru.
Apoorv Parijat
1
Berikut adalah fungsi bash untuk menambahkan perintah crontabtanpa duplikasi
function addtocrontab (){local frequency=$1
local command=$2
local job="$frequency $command"
cat <(fgrep -i -v "$command"<(crontab -l))<(echo "$job")| crontab -}
addtocrontab "0 0 1 * *""echo hello"
tambahkan parameter -w ke grep perintah yang tepat, tanpa parameter -w menambahkan cronjob "pengujian" menyebabkan penghapusan pekerjaan cron "testing123"
fungsi skrip untuk menambah / menghapus cronjobs. tidak ada entri duplikasi:
Ini akan memastikan Anda menangani baris baru kosong di bagian bawah dengan benar. Untuk menghindari masalah dengan crontab, Anda biasanya harus mengakhiri file crontab dengan baris baru yang kosong. Dan skrip di atas memastikan terlebih dahulu menghapus setiap baris kosong dengan "grep." bagian, dan kemudian tambahkan baris kosong baru di akhir dengan "\ n" di akhir skrip. Ini juga akan mencegah mendapatkan baris kosong di atas perintah baru Anda jika file crontab Anda yang ada berakhir dengan baris kosong.
Jawaban:
Anda dapat menambahkan ke crontab sebagai berikut:
Penjelasan garis cron
Sumber nixCraft .
sumber
(crontab -l ; echo "00 09 * * 1-5 echo hello") | crontab -
- lebih mudah untuk menyalin;
dengan&&
sebagai penjaga keamanan terhadap kasus ini jikacrontab -l
gagal. jadi, seperti:(crontab -l && echo "0 0 0 0 0 some entry") | crontab -
crontab -l
gagal jika tidak ada crontab, jadi menggunakan&&
skrip tidak mungkin untuk menambahkan entri pertama ke crontab.Anda mungkin dapat melakukannya dengan cepat
crontab -l
daftar pekerjaan crontab saat ini,cat
mencetaknya,echo
mencetak perintah baru dancrontab -
menambahkan semua barang yang dicetak ke dalam file crontab. Anda dapat melihat efeknya dengan melakukan yang barucrontab -l
.sumber
crontab -l
daftar pekerjaan crontab saat ini,cat
mencetaknya,echo
mencetak perintah baru dancrontab -
menambahkan semua barang yang dicetak ke dalam file crontab. Anda dapat melihat efeknya dengan melakukan yang barucrontab -l
no crontab for <username>
, tetapi tetap berfungsi.(crontab -l ; echo "00 09 * * 1-5 echo hello") | crontab -
bekerja.Yang lebih pendek ini tidak memerlukan file sementara, itu kebal terhadap banyak penyisipan, dan memungkinkan Anda mengubah jadwal entri yang ada.
Katakan Anda memiliki ini:
Untuk menambahkannya ke crontab, tanpa duplikasi:
Untuk menghapusnya dari crontab apa pun jadwal saat ini:
Catatan:
sumber
Terima kasih semuanya atas bantuan Anda. Menyatukan apa yang saya temukan di sini dan di tempat lain saya datang dengan ini:
Kode
Saya tidak tahu bagaimana cara menghilangkan kebutuhan untuk dua variabel tanpa mengulangi sendiri.
command
jelas merupakan perintah yang ingin saya jadwalkan.job
mengambil$command
dan menambahkan data penjadwalan. Saya membutuhkan kedua variabel secara terpisah di baris kode yang berfungsi.Detail
<(*command*)
) ini untuk mengubah outputcrontab -l
menjadi input untukfgrep
perintah.fgrep
kemudian memfilter kecocokan$command
(-v
opsi), tidak peka huruf besar-kecil (-i
opsi).<(*command*)
) digunakan untuk mengubah hasilnya kembali menjadi input untukcat
perintah.cat
perintah juga menerimaecho "$job"
(self explanatory), sekali lagi, melalui penggunaan thingy redirect (<(*command*)
).crontab -l
dan yang sederhanaecho "$job"
, digabungkan, disalurkan ('|') kecrontab -
untuk akhirnya ditulis.Pendeknya:
Baris kode ini menyaring semua pekerjaan cron yang cocok dengan perintah, kemudian menulis pekerjaan cron yang tersisa dengan yang baru, secara efektif bertindak seperti fungsi "tambah" atau "perbarui". Untuk menggunakan ini, yang harus Anda lakukan adalah menukar nilai untuk
command
danjob
variabel.sumber
fgrep -v
crontab -l | fgrep -i -v "$command" | { cat; echo "$job"; } | crontab -l
EDIT (perbaikan penulisan):
sumber
crontab -l
gagal, tetapicrontab -
berhasil, crontab Anda akan menjadi one-liner.Ada banyak jawaban bagus seputar penggunaan crontab, tetapi tidak disebutkan metode yang lebih sederhana, seperti menggunakan
cron
.Menggunakan
cron
akan memanfaatkan file sistem dan direktori yang berlokasi di/etc/crontab
,/etc/cron.daily,weekly,hourly
atau/etc/cron.d/
:Dalam contoh di atas, kami membuat file di
/etc/cron.d/
, menyediakan variabel lingkungan untuk perintah untuk mengeksekusi berhasil, dan menyediakanuser
untuk perintah, dancommand
itu sendiri. File ini seharusnya tidak dapat dieksekusi dan namanya hanya boleh mengandung alfanumerik dan tanda hubung (lebih detail di bawah).Untuk memberikan jawaban yang menyeluruh, mari kita lihat perbedaan antara
crontab
vscron/crond
:Bagi mereka yang ingin menjalankan pekerjaan dalam konteks pengguna mereka pada sistem, menggunakan
crontab
mungkin masuk akal.Bagi mereka yang menggunakan manajemen konfigurasi atau ingin mengelola pekerjaan untuk pengguna lain, dalam hal ini kita harus menggunakan
cron
.Kutipan cepat dari halaman manual memberi Anda beberapa contoh tentang apa yang harus dan tidak harus dilakukan:
Mengelola crons dengan cara ini lebih mudah dan lebih terukur dari perspektif sistem, tetapi tidak akan selalu menjadi solusi terbaik.
sumber
<job>
tidak boleh menyertakan ekstensi file.Kemungkinannya adalah Anda mengotomatisasi ini, dan Anda tidak ingin satu pekerjaan ditambahkan dua kali. Dalam hal ini gunakan:
Ini hanya berfungsi jika Anda menggunakan BASH. Saya tidak mengetahui
sh
sintaks DASH ( ) yang benar.Pembaruan: Ini tidak berfungsi jika pengguna belum memiliki crontab. Cara yang lebih andal adalah:
Atau, jika distro Anda mendukungnya, Anda juga dapat menggunakan file terpisah:
Menemukan mereka dalam pertanyaan SO lainnya .
sumber
sh: 1: Syntax error: "(" unexpected
menggunakan sh .<
dan(
. Itu berarti< (
gagal tetapi<(
berfungsi, kecuali ada tanda bintang di jadwal Anda ...cat <(crontab -l |grep -v "${CRON}") <(echo "${CRON}") | crontab -
Untuk pembuatan / penggantian crontab dari dengan skrip BASH yang cepat dan kotor, saya menggunakan notasi ini:
sumber
Varian yang hanya mengedit crontab jika string yang diinginkan tidak ditemukan di sana:
sumber
Jika Anda menggunakan Vixie Cron, mis. Pada sebagian besar distribusi Linux, Anda cukup meletakkan file di /etc/cron.d dengan masing-masing cronjob.
Ini hanya berfungsi untuk root saja. Jika sistem Anda mendukung ini, Anda akan melihat beberapa contoh di sana. (Catat nama pengguna yang disertakan dalam baris, dalam sintaksis yang sama dengan yang lama / etc / crontab)
Ini adalah kesalahan yang menyedihkan di cron bahwa tidak ada cara untuk menangani hal ini sebagai pengguna biasa, dan begitu banyak implementasi cron tidak memiliki cara sama sekali untuk menangani hal ini.
sumber
Jadi, di Debian, Ubuntu, dan banyak distro berbasis Debian serupa ...
Ada mekanisme penggabungan tugas cron yang mengambil file konfigurasi, bundel mereka dan menambahkannya ke layanan cron Anda berjalan.
Anda dapat meletakkan file di bawah /etc/cron.d/somefilename di mana somefilename adalah apa pun yang Anda inginkan.
Mari kita bongkar ini:
sudo - karena Anda memerlukan hak yang lebih tinggi untuk mengubah konfigurasi cron di bawah direktori / etc
gema - kendaraan untuk membuat output pada std out. printf, cat ... akan bekerja juga
"- gunakan doublequote di awal string Anda, Anda seorang profesional
0,15,30,45 * * * * - jadwal lari cron standar, ini berjalan setiap 15 menit
ntpdate -u time.nist.gov - perintah aktual yang ingin saya jalankan
"- karena tanda kutip ganda pertama saya membutuhkan seorang teman untuk menutup garis yang sedang diproduksi
>> - pengalihan dua kali lipat alih-alih menimpa *
/etc/cron.d/vmclocksync - vmclocksync adalah nama file yang saya pilih, ia berada di /etc/cron.d/
* jika kami menggunakan> redirect, kami dapat menjamin bahwa kami hanya memiliki satu entri tugas. Tapi, kita berisiko membuang aturan lain dalam file yang ada. Anda dapat memutuskan sendiri apakah kemungkinan penghancuran dengan> benar atau kemungkinan duplikat dengan >> adalah untuk Anda. Atau, Anda dapat melakukan sesuatu yang berbelit-belit atau terlibat untuk memeriksa apakah nama file ada, jika ada sesuatu di dalamnya, dan apakah Anda menambahkan jenis duplikat - tetapi, saya memiliki beberapa hal untuk dilakukan dan saya tidak dapat melakukannya untuk kamu sekarang
sumber
Skrip Bash untuk menambahkan pekerjaan cron tanpa editor interaktif. Kode di bawah ini membantu menambah cronjob menggunakan file linux.
sumber
Berikut adalah fungsi bash untuk menambahkan perintah
crontab
tanpa duplikasisumber
tambahkan parameter -w ke grep perintah yang tepat, tanpa parameter -w menambahkan cronjob "pengujian" menyebabkan penghapusan pekerjaan cron "testing123"
fungsi skrip untuk menambah / menghapus cronjobs. tidak ada entri duplikasi:
diuji:
sumber
Solusi pilihan saya adalah:
Ini akan memastikan Anda menangani baris baru kosong di bagian bawah dengan benar. Untuk menghindari masalah dengan crontab, Anda biasanya harus mengakhiri file crontab dengan baris baru yang kosong. Dan skrip di atas memastikan terlebih dahulu menghapus setiap baris kosong dengan "grep." bagian, dan kemudian tambahkan baris kosong baru di akhir dengan "\ n" di akhir skrip. Ini juga akan mencegah mendapatkan baris kosong di atas perintah baru Anda jika file crontab Anda yang ada berakhir dengan baris kosong.
sumber
sumber
Tidak, tidak ada opsi di crontab untuk memodifikasi file cron.
Anda harus: mengambil file cron saat ini (crontab -l> newfile), ubah dan letakkan file baru di tempatnya (crontab newfile).
Jika Anda terbiasa dengan perl, Anda dapat menggunakan modul ini Config :: Crontab .
LLP, Andrea
sumber
fungsi skrip untuk menambahkan cronjobs. periksa entri duplikat, ekspresi yang bisa digunakan *> "
diuji:
sumber: otak saya;)
sumber
Anda mungkin dapat mengubah editor default menjadi ed dan menggunakan heredoc untuk mengedit.
Perhatikan bagian depan > dalam kode itu berarti tombol kembali / masuk ditekan untuk membuat baris baru.
The sebuah alat APPEND sehingga tidak akan menimpa apa-apa.
The . berarti Anda selesai mengedit.
The w berarti MENULIS perubahan.
The q berarti QUIT atau keluar ed.
Anda bisa memeriksanya
Anda juga dapat menghapus entri.
Itu akan menghapus entri crontab dengan Myscript di dalamnya.
The d berarti menghapus pola dalam / / .
Tidak periksa lagi
Solusi ini bekerja di dalam naskah terlalu kurang > tentu saja :-)
sumber