Seberapa tepat daemon cron?

22

Apakah penjadwal pekerjaan cron benar-benar tepat?

Maksudku, aku butuh skrip untuk menjalankan setiap malam secepat mungkin, TETAPI sebelum pukul 00:00 hari berikutnya.

Saya idealnya menjalankan pekerjaan cron pada 23.59 (atau 11:59 malam), tetapi apakah sistemnya benar-benar tepat? Karena masalah kedua tidak masalah, haruskah saya mengatur tugas cron ke 23:58 untuk membiarkannya beberapa saat?

Sebastian
sumber
13
Mengapa Anda memiliki persyaratan ini? Saya merasa akan ada cara yang lebih baik untuk melakukan apa pun yang benar-benar Anda coba lakukan, dan Anda mungkin juga bertanya tentang itu. (Ini akan membutuhkan sedikit usaha lebih dari sekadar menjadwalkan pekerjaan cron, tapi mungkin tidak lebih.)
David Z
Saya biasa menggunakan cron bodoh tua dengan presisi 10 menit.
joshudson
7
Kebutuhan Anda terlihat tidak terlalu dapat diandalkan untuk saya. Apa yang Anda lakukan jika sistem Anda memiliki beban tinggi sekitar tengah malam. Kecuali Anda memiliki sistem RT, Anda tidak dapat menjamin apa pun.
Thomas Erker
Pertimbangkan bahwa meskipun Anda berhasil mendapatkan server yang selalu tersedia dan selalu dapat menyelesaikan pekerjaan Anda dalam waktu kurang dari satu detik, masih ada hal-hal yang dapat salah. Misalnya, jam Anda mungkin mulai melayang tanpa Anda sadari. Ini benar-benar rapuh dan saya setuju dengan komentar di atas bahwa sistem perlu diubah.
Chris Hayes

Jawaban:

24

Yang dapat dijamin cron adalah bahwa pekerjaan Anda akan dimulai tidak lebih cepat dari waktu yang ditentukan (tergantung pada ketepatan jam sistem). Tetapi tidak ada cara untuk memberi Anda jaminan tentang waktu pemutusan hubungan kerja. Itu akan tergantung pada banyak faktor:

  • Seberapa dimuat sistem
  • Apa yang dilakukan pekerjaan itu
  • Kelambatan karena masalah perangkat keras
  • Kelambatan karena masalah jaringan (dengan asumsi pekerjaan tergantung pada jaringan)

Rekomendasi saya adalah untuk mengubah desain Anda sehingga waktu penyelesaian tertentu bukan persyaratan.

kasperd
sumber
1
Cara termudah untuk melakukan ini mungkin untuk memiliki pekerjaan yang dimulai melalui cron membuat file untuk menunjukkan sedang berjalan yang dihapus setiap kali pekerjaan keluar (berhasil atau tidak berhasil), dan kemudian pekerjaan berikutnya (dengan asumsi itulah tujuannya) tunggu hingga file hilang sebelum melakukan apa pun.
CVn
@ MichaelKjörling Anda harus menggunakan direktori, bukan file, karena memeriksa file dan kemudian membuatnya bukan atom .
8bittree
1
@ 8bittree Anda dapat menggunakan kawanan juga jika tersedia.
user9517 mendukung GoFundMonica
1
@ MichaelKjörling Tapi mengapa repot-repot dengan kasus mungkin baik-baik saja ketika kasus yang benar juga lebih sederhana?
8bittree
4
@ 8bittree Jika Anda menggunakan O_CREATdan O_EXCLmenandai itu akan menjadi atom selama file ada pada sistem file lokal.
kasperd
14

Saya kira ini tergantung pada cron daemon Anda, tetapi dokumentasi dan standar menunjukkan bahwa jika Anda menentukan menit, pekerjaan akan dijalankan pada menit yang ditentukan.

Lihat:

Ketahuilah bahwa skrip Anda akan dimulai ketika jam berdetak ke waktu yang tepat, tetapi akan selesai beberapa saat setelah itu.

Falcon Momot
sumber
Saya memiliki server virtual dengan beban yang sangat rendah, namun cron yang diatur untuk berjalan setiap menit kadang-kadang mulai dari 0s, 1s, 2s, terkadang hingga 17s. Dugaan saya adalah bahwa cron dapat kurang akurat pada server virtual, karena proses lain di luar server itu dapat mempengaruhi ketersediaan sumber daya seperti CPU.
Liam
8

Biasanya cron akan mulai pada 23:59:00 , memindai semua file crontab Anda, menyaring orang-orang yang relevan untuk 23:59 dan kemudian mulai. Memindai file ini sangat cepat, karena jumlahnya tidak banyak dan semuanya hanya berisi beberapa baris. Jadi biasanya, cronjobs mulai pukul 23:59:00 atau 23:59:01 Ada cara pasti untuk memperlambat proses ini. (tambahkan jutaan baris ke crontab, misalnya). Jika sistem benar-benar kelebihan beban, ini juga tidak akan bekerja secepat itu.

Juga, ini jelas tergantung pada implementasi.

Jika Anda membutuhkan waktu mulai yang sangat tepat, Anda lebih baik membuat program yang tidur sampai waktu yang Anda inginkan dan kemudian berjalan (misalnya menggunakan c ++ 11 ). Tetapi pada OS non-waktu nyata, ini juga tidak akan tepat! Juga jam PC tidak tahu waktu yang tepat!

Dalam semua kasus, ini hanya memastikan program dimulai pada (kurang lebih) waktu yang Anda inginkan. Tidak ada jaminan bahwa program berakhir sukses sampai waktu tertentu, jadi saya sangat percaya Anda harus mengubah sesuatu pada persyaratan itu.

Josef
sumber
2
Saya percaya crontab disimpan dalam memori - jika Anda mengedit file di belakang crontab secara langsung (bukan crontab -e, yang memberitahukan cron saat selesai), perubahan tidak akan berpengaruh. cron memiliki banyak sekali downtime untuk mencari tahu pekerjaan apa yang akan datang, ia dapat "tidur" sampai detik tepat pekerjaan itu akan dijalankan.
AMADANON Inc.
0

Itu tergantung dari keseluruhan waktu eksekusi skrip Anda dan ketepatan waktu server.

59 23 * * * /some/script/file.sh

akan meluncurkan skrip Anda tepat pada 23:59, tetapi, jika Anda memiliki beberapa perintah yang bekerja lama, bagian dari skrip dapat dieksekusi setelah tengah malam.

orang aneh
sumber
tepatnya pukul 23:59 , jadi bisa dari 23:59:00 hingga 23:59:59?
AL
2
Anda tidak memiliki detik di cron normal. Untuk mendapatkan tambahan 59 detik itu, Anda harus menambahkan 'tunggu (59)' di bagian atas kode Anda.
Henry's Cat
4
@AL dalam praktiknya, saya selalu melihatnya dijalankan di xx: xx: 00 atau xx: xx: 01, tetapi pada sistem yang sarat muatan tidak ada dan tidak ada janji.
hobbs