Bisakah saya menjalankan pekerjaan cron lebih sering daripada setiap menit?

44

Apakah mungkin menjalankan pekerjaan cron setiap 30 detik tanpa perintah tidur?

pengguna15336
sumber
4
Apa niatmu Apakah cron alat yang tepat untuk digunakan untuk ini?
Manuel Faux
Pertanyaan bagus.
Preet Sangha
Sebagai contoh, saya saat ini menggunakan cron untuk mengubah gambar latar belakang desktop saya, untuk menghindari batasan dari pengalih gambar latar belakang asli (tidak masuk ke subdirektori). Jika saya ingin beralih lebih sering dari sekali per menit, saya akan mengalami batasan cron ini. (meskipun switcher bg asli memiliki batasan yang sama)
donquixote

Jawaban:

36

Jika tugas Anda harus sering dijalankan, cron adalah alat yang salah. Selain dari fakta bahwa itu tidak akan meluncurkan pekerjaan yang sering, Anda juga berisiko beberapa masalah serius jika pekerjaan itu membutuhkan waktu lebih lama untuk berjalan daripada interval antara peluncuran. Tulis ulang tugas Anda untuk daemonisasi dan berjalan terus-menerus, kemudian jalankan dari cron jika perlu (sambil memastikan bahwa itu tidak akan diluncurkan kembali jika sudah berjalan).

duskwuff
sumber
18
Bagian "Anda juga berisiko beberapa masalah serius jika pekerjaan itu membutuhkan waktu lebih lama daripada interval antara peluncuran." itu tidak benar dan jika itu berlaku untuk pekerjaan yang berjalan setiap 5 menit, setiap jam, atau setiap bulan dalam hal ini. Masalah itu memiliki solusi (menggunakan pidfile atau apa pun dan memeriksa apakah pekerjaan sudah berjalan sebelum menjalankannya). Jadi masalahnya adalah bahwa cron tidak akan membiarkan frekuensi itu, tetapi tidak benar untuk mengatakan bahwa ada sesuatu yang secara intrinsik salah dalam menjalankan tugas setiap kurang dari satu menit.
matteo
2
Maksud saya jika Anda tidak menggunakan pidfile. Jika pekerjaan Anda berjalan setiap X menit, dan membutuhkan lebih dari X menit untuk menyelesaikannya, Anda akan berakhir dengan pekerjaan yang menumpuk. Jika pekerjaan Anda juga dibatasi oleh beberapa jenis sumber daya (CPU, bandwidth jaringan / disk, dll), menjalankan lebih banyak pada suatu waktu akan membuatnya lebih lama untuk menyelesaikannya, dan pada akhirnya komputer Anda akan berubah menjadi kekacauan besar.
duskwuff
2
Anda dapat menggunakan run-oneuntuk memastikan program / bahkan skrip PHP tidak memulai duplikat instance. sudo apt-get install run-onedan menyebutnya denganrun-one <normal command>
kouton
3
Sebagai jawaban lebih lanjut menunjukkan, itu sangat mungkin, meskipun agak meretas. Mengapa ANDA MELAKUKANNYA SALAH !!!! jawaban yang diterima di sini, ketika tidak menjawab pertanyaan sama sekali?
Seseorang
@Mantriur Karena penulis pertanyaan merasa terbantu dan menandainya sebagai jawaban yang diterima? :) Tetapi serius, meskipun, Anda sudah mengidentifikasi masalah sendiri: banyak dari jawaban kontemporer lainnya mengusulkan solusi peretasan yang tidak bijaksana untuk digunakan dalam sistem produksi. (Juga, ingatlah bahwa beberapa jawaban lain hanya muncul bertahun-tahun setelah pertanyaan diajukan, sehingga mereka belum siap untuk menerima!)
duskwuff
37

Calon untuk penyalahgunaan perintah Linux yang paling kreatif :

nohup watch -n 30 --precise yourprog >/dev/null &

Jika yourprogterdiri dari:

date +%M.%S.%N >> yourprog.out

maka yourprog.outmungkin terlihat seperti:

50.51.857291267
51.21.840818353
51.51.840910204
52.21.840513307
52.51.842455224
53.21.841195858
53.51.841407587
54.21.840629676

menunjukkan tingkat presisi yang cukup baik.

Berikut ini penjelasan bagian-bagian dari perintah:

  • nohup- Ini membuat perintah yang mengikutinya, watchdalam hal ini, tidak keluar ketika terminal keluar.
  • watch- Program ini menjalankan perintah berulang kali. Biasanya layar penuh keluaran dari perintah ditampilkan setiap kali watchmenjalankan perintah.
  • -n 30- Interval untuk menjalankan perintah. Dalam hal ini setiap tiga puluh detik.
  • --precise- Tanpa opsi ini, watchjalankan perintah setelah interval detik. Dengan itu, setiap awal perintah dimulai pada interval jika memungkinkan. Jika opsi ini tidak ditentukan dalam contoh, waktu akan bertambah lebih dari 30 detik setiap kali karena waktu yang dibutuhkan untuk meluncurkan dan menjalankan perintah ( yourprog).
  • yourprog- Program atau baris perintah untuk watchdieksekusi. Jika baris perintah berisi karakter khusus untuk shell (mis. Spasi atau titik koma) itu perlu dikutip.
  • >/dev/null- Semakin besar pengalihan output dari perintah yang dijalankan oleh watchke file /dev/null,. File itu membuang semua data yang ditulis padanya. Ini mencegah output dari ditulis ke layar atau, karena nohupsedang digunakan, itu mencegah output dikirim ke file yang disebut nohup.out.
  • &- watchPerintah dijalankan di latar belakang dan kontrol dikembalikan ke proses terminal atau induk.

Perhatikan bahwa nohup, pengalihan output dan &operator kontrol latar belakang tidak spesifik untuk watch.

Berikut ini penjelasan dari contoh yourprogskrip:

  • date- Output tanggal dan / atau waktu saat ini. Itu juga bisa mengaturnya.
  • +%M.%S.%N- Ini menentukan format output untuk datedigunakan. %Madalah menit saat ini, %Sadalah detik saat ini dan %Nadalah nanosecond saat ini.
  • >> yourprog.out- Ini mengarahkan output dari dateperintah ke file bernama yourprog.out. Dobel lebih besar daripada menyebabkan output ditambahkan ke file pada setiap doa daripada isi sebelumnya ditimpa.

Edit :

Mungkin hal lain yang bisa disalahgunakan (atau mungkin itu penggunaan yang sah) adalah timer sistemd.

Lihat systemd / Timer sebagai pengganti cron dan timer Cron vs systemd .

Saya akan mencoba memposting contoh segera.

Dennis Williamson
sumber
6
Saya memberi +1 untuk pipi murni
Matt Simmons
2
Akan menyenangkan untuk memiliki sedikit penjelasan dengan jawaban ini. Perintah nohup baru bagi saya. Internet memberi tahu saya bahwa mengabaikan sinyal hangup. Yang masih membuat saya bingung.
donquixote
2
@donquixote: Penting untuk mengetahui bahwa perintah secara keseluruhan dalam jawaban saya bukanlah hal yang disarankan untuk dilakukan, oleh karena itu penggunaan kata "penyalahgunaan". Namun, untuk sedikit memperjelas hal-hal untuk Anda karena ada teknik yang berguna termasuk saya akan mencoba untuk menjelaskan beberapa. The &menyebabkan perintah untuk berjalan di latar belakang, kembali kontrol ke command prompt segera. Menggunakan nohupperintah menyebabkan proses latar belakang (dalam hal ini watch) mengabaikan sinyal hangup yang dikirim ketika shell keluar seperti ketika Anda menutup terminal. ...
Dennis Williamson
1
... Mengarahkan output dengan menggunakan >/dev/nullmenyebabkan output akan dibuang dan mencegah pembuatan nohup.outfile yang seharusnya dibuat ketika output standar adalah terminal.
Dennis Williamson
1
@donquixote: Tidak hanya 30 detik dari sekarang, setiap 30 detik. Sisanya adalah menjalankannya tanpa pengawasan di latar belakang agar lebih seperti cron. Jika Anda ingin menggunakan sleep, Anda harus menulis satu loop sehingga prosesnya akan berulang ( watchapakah ini berulang untuk Anda, seperti halnya cron). Anda masih membutuhkan nohupdan &. Masalah tambahannya sleepadalah waktu. The --precisepilihan untuk watchMenghindari ini. Tanpa itu atau ketika menggunakan sleepdalam satu lingkaran, interval waktu memiliki waktu yang dibutuhkan untuk menjalankan perintah atau skrip ditambahkan sehingga setiap proses menjadi lebih lambat dan lebih lambat daripada ...
Dennis Williamson
13

Cron dirancang untuk bangun setiap menit, jadi tidak mungkin melakukannya tanpa peretasan, misalnya tidur seperti yang Anda sebutkan.

Balázs Pozsár
sumber
10
* * * * * /path/to/program
* * * * * sleep 30; /path/to/program

Jangan lupa untuk menulis sesuatu ke dalam program Anda sehingga keluar jika instance sebelumnya sudah berjalan.

#!/bin/sh

if ln -s "pid=$$" /var/pid/myscript.pid; then
  trap "rm /var/pid/myscript.pid" 0 1 2 3 15
else
  echo "Already running, or stale lockfile." >&2
  exit 1
fi

Tentu saja, ini masih menyisakan peluang kegagalan yang sangat kecil, jadi cari google untuk solusi yang lebih baik yang berlaku untuk lingkungan Anda.

ghoti
sumber
telah ditanyakan:without a sleep command
philippe
10
Pengunjung lain yang menemukan pertanyaan ini tidak peduli apakah perintah tidur digunakan :)
donquixote
8

Anda dapat melakukan ini dengan perangkat lunak pihak ketiga.

Opsi yang telah bekerja dengan baik untuk saya adalah sering-cron

Ini memungkinkan ketepatan milidetik dan memberi Anda opsi untuk menunda eksekusi berikutnya sampai yang saat ini telah keluar ..

juan itu
sumber
1
Frequent-cron telah bekerja dengan baik untuk kami juga dan mendukung banyak sistem produksi kami. Kami belum pernah memiliki masalah dengan itu.
Homer6
2

Saya memiliki beberapa masalah:

(1) terkadang suatu sistem menjadi sibuk dan tidak dapat memulai sesuatu dengan tepat pada titik 30 detik, maka ada kemungkinan bahwa pada saat yang sama Anda menjalankan satu pekerjaan pekerjaan lain akan muncul dan kemudian Anda memiliki 2 (atau lebih) pekerjaan melakukan hal yang sama benda. Tergantung pada skripnya, mungkin ada beberapa gangguan signifikan di sini. Dengan demikian, pengkodean dalam skrip semacam itu harus berisi beberapa kode untuk memastikan bahwa hanya satu contoh skrip yang diberikan berjalan pada saat yang sama.

(2) Skrip mungkin memiliki banyak overhead, dan mengkonsumsi lebih banyak sumber daya sistem daripada yang Anda inginkan. Ini benar jika Anda bersaing dengan banyak kegiatan sistem lainnya.

Jadi seperti yang dituliskan oleh satu poster, dalam hal ini saya akan mempertimbangkan untuk memasang daemon yang berjalan dengan proses tambahan untuk memastikannya tetap berjalan jika itu sangat penting bagi operasi Anda.

mdpc
sumber
1

solusi paling sederhana dan favorit saya untuk tugas ini:

entri cron:
* * * * * flock -w0 /path/to/script /path/to/script

naskah:
while true;do echo doing something; sleep 10s;done

alternatif malas: :)

* * * * * flock -w0 /path/to/log watch -n 10 echo doing >> /path/to/log

atau

* * * * * flock -w0 /path/to/log watch -n 10 /path/to/script

pro

  • penggunaan flockperintah menghindari menjalankan skrip dengan banyak contoh dalam waktu yang bersamaan. Ini bisa menjadi sangat penting dalam banyak kasus.
  • flockdan watchperintah tersedia di sebagian besar pemasangan Linux

kontra

  • menghentikan "Layanan" semacam ini membutuhkan dua langkah
    • mengomentari entri cron
    • bunuh script atau watchperintahnya
asvany
sumber
2
Dapatkah seseorang tolong menjelaskan hal ini kepada pemula linux - dengan pro dan kontra? Terima kasih ..
a20
@asvany Saya pikir saya suka solusi ini tetapi sebagai a20, bisakah Anda memposting beberapa penjelasan untuk Linux "hijau"? ty.
JoelAZ
0

Sebuah solusi, jika itu untuk skrip Anda sendiri atau jika Anda dapat membungkusnya:

  1. Dapatkan dan ingat waktu mulai.
  2. Jika file kunci, yang akan Anda sentuh nanti, ada dan skrip belum berjalan selama 60 detik, tunggu sebentar dan periksa lagi. (mis. saat / tidur) *
  3. Jika file kunci masih ada setelah 60 detik berlalu, keluar dengan peringatan kunci basi.
  4. Sentuh file kunci.
  5. Meskipun skrip belum berjalan selama 60 detik, putar tugas Anda yang sebenarnya dengan durasi tidur yang diinginkan.
  6. Hapus file kunci.
  7. Tambahkan sebagai cron cekatan.
  8. Bob adalah pamanmu.

Lebih sedikit sakit kepala daripada membangun dan memonitor daemon.

* Jika Anda menggunakan PHP, ingat clearstatcache ().

Some one
sumber