Saya ingin dapat secara sistematis menambahkan pekerjaan cron baru, apa cara terbaik untuk melakukan ini?
Dari penelitian saya , sepertinya saya bisa membuang crontab saat ini dan kemudian menambahkan yang baru, menyalurkannya kembali ke crontab:
(crontab -l ; echo "0 * * * * wget -O - -q http://www.example.com/cron.php") | crontab -
Apakah ada cara yang lebih baik?
Jawaban:
Itu selalu bekerja dengan baik untuk saya.
Anda harus mempertimbangkan skrip yang sedikit lebih canggih yang dapat melakukan tiga hal.
Tambahkan garis crontab; memastikan bahwa itu tidak ada. Menambahkan ketika sudah ada buruk.
Hapus garis crontab. Mungkin hanya peringatan jika tidak ada.
Kombinasi dari dua fitur di atas untuk menggantikan garis crontab.
sumber
Cara terbaik jika Anda menjalankan sebagai root, adalah dengan memasukkan file ke /etc/cron.d
jika Anda menggunakan manajer paket untuk mengemas perangkat lunak Anda, Anda dapat meletakkan file di direktori itu dan ditafsirkan seolah-olah itu adalah crontab, tetapi dengan bidang tambahan untuk nama pengguna, misalnya:
Nama file:
/etc/cron.d/per_minute
Kandungan:
* * * * * root /bin/sh /home/root/script.sh
sumber
/etc/cron.d/*
? Sulit untuk mengetahui apakah sesuatu berfungsi jika seseorang harus menunggu satu jam untuk memeriksa!Solusi OP memiliki bug, mungkin memperbolehkan entri ditambahkan dua kali, gunakan di bawah untuk memperbaikinya.
sumber
sort
sebelumnyauniq
, misalnya:(crontab -l ; echo "0 * * * * your_command") | sort - | uniq - | crontab -
uniq
. Gunakan-u
opsi padasort
.Untuk menambahkan sesuatu ke cron
Untuk menghapus ini dari cron
harapan akan membantu seseorang
sumber
2>&1 | grep -v "no crontab"
karena ketika tidak ada crontab, garis outputcrontab: no crontab for...
dikirim ke stderr. Tidak ada alasan untuk menangkap output itu, mengirimkannya ke stdout, dan kemudian menyaringnya menggunakan grep. Jika tujuan Anda adalah untuk menghindari melihatcrontab: no crontab for...
output Anda, maka gunakan2> /dev/null | sort....
.Jika Anda berencana melakukannya untuk skenario sekali jalan hanya untuk mendapatkan sesuatu, lihat 'pada'
sumber
Cukup ubah perintah editor menjadi tee:
sumber
Dengan asumsi bahwa sudah ada entri di crontab Anda, perintah berikut harus bekerja relatif baik. Perhatikan bahwa
$CMD
variabel hanya ada untuk dibaca. Menyortir sebelum memfilter duplikat penting, karenauniq
hanya berfungsi pada baris yang berdekatan.Jika saat ini Anda memiliki crontab kosong, Anda akan menerima kesalahan berikut untuk stderr:
Jika Anda ingin menghindari ini, Anda dapat menambahkan sedikit kerumitan dan melakukan sesuatu seperti ini:
sumber
Sebagian besar solusi di sini adalah dengan menambahkan baris ke crontab. Jika Anda membutuhkan lebih banyak kontrol, Anda ingin dapat mengontrol seluruh konten crontab.
Anda dapat menggunakan perpipaan untuk melakukan ini dengan cukup elegan.
Untuk sepenuhnya menulis ulang crontab, lakukan
Ini harus mudah digabungkan dengan jawaban lain yang dijelaskan di sini seperti
Atau, jika Anda memiliki konten dalam file, itu bahkan lebih sederhana
sumber
Berikut cara satu-liner lain, yang menghindari duplikat
Dan inilah cara untuk melakukan jawaban dan menghindari
no crontab for user
pesan dari JohnZ , atau jika Anda perlu beroperasi diset -eu
lingkungan tipe dan tidak bisa mendapatkan apa pun yang mengembalikan kegagalan (dalam hal ini2>/dev/null
bagian ini opsional):Atau jika Anda ingin membagi beberapa hal agar lebih mudah dibaca:
Atau secara opsional menghapus referensi ke perintah_Anda (mis: jika jadwal telah berubah, Anda hanya ingin itu pernah dicatat sekali). Dalam hal ini kita tidak lagi membutuhkan
uniq
(bonus tambahan, urutan penyisipan juga dipertahankan):sumber
man crontab juga berguna:
CRONTAB (1)
NAMA
RINGKASAN
sumber
Menambah jawaban JohnZ, inilah sintaks untuk menjadwalkan sebagai root jika Anda seorang sudoer:
sumber
sumber
Ini akan memeriksa untuk memastikan bahwa perintah Anda belum ada sebelum menambahkannya.
Bersulang.
sumber
Mem-pipkan stdout ke
crontab
tidak menginstal crontab baru untuk saya di macOS, jadi saya menemukan solusi ini sebagai gantinya, menggunakantee
editor di sub shell:sumber
Jika Anda ingin tugas dijalankan sebagai pengguna:
Jika Anda ingin tugas dijalankan dengan hak istimewa:
dan periksa tugas (dengan atau tanpa 'sudo'):
sumber
Anda juga dapat menambahkan tugas Anda ke /etc/cron.*/
sumber
Anda juga dapat mengedit file teks tabel cron secara langsung, tetapi solusi Anda tampaknya dapat diterima.
sumber