pengembangan-web-mp-pd.com

Bisakah saya menjalankan pekerjaan cron lebih sering daripada setiap menit?

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

48
user15336

Jika tugas Anda harus sering dijalankan, cron adalah alat yang salah. Selain dari fakta bahwa itu tidak akan meluncurkan pekerjaan sesering itu, Anda juga berisiko beberapa masalah serius jika pekerjaan itu memakan waktu lebih lama 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).

38

Calon untuk paling kreatif penyalahgunaan dari perintah Linux:

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

Jika yourprog terdiri dari:

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

kemudian yourprog.out mungkin 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, watch dalam kasus ini, tidak keluar ketika terminal keluar.
  • watch - Program ini menjalankan perintah berulang kali. Biasanya layar penuh keluaran dari perintah ditampilkan setiap kali watch menjalankan perintah.
  • -n 30 - Interval untuk menjalankan perintah. Dalam hal ini setiap tiga puluh detik.
  • --precise - Tanpa opsi ini, watch menjalankan 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 diperlukan untuk meluncurkan dan menjalankan perintah (yourprog).
  • yourprog - Program atau baris perintah untuk watch untuk dieksekusi. 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 watch ke file, /dev/null. File itu membuang semua data yang ditulis padanya. Ini mencegah output dari ditulis ke layar atau, karena Nohup sedang digunakan, itu mencegah output dikirim ke file bernama Nohup.out.
  • & - Perintah watch 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 script yourprog:

  • date - Output tanggal dan/atau waktu saat ini. Itu juga bisa mengaturnya.
  • +%M.%S.%N - Ini menentukan format output untuk date untuk digunakan. %M adalah menit saat ini, %S adalah detik saat ini dan %N adalah nanodetik saat ini.
  • >> yourprog.out - Ini mengalihkan output dari perintah date ke file bernama yourprog.out. Dobel lebih besar dari pada 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/Timers sebagai pengganti cron dan Cron vs systemd timer .

Saya akan mencoba memposting contoh segera.

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

14
Balázs Pozsár
* * * * * /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.

13
ghoti

Anda dapat melakukan ini dengan perangkat lunak pihak ketiga.

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

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

8
thatjuan

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 yang 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.

2
mdpc

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 perintah flock menghindari menjalankan skrip dengan banyak instance dalam waktu yang bersamaan. Ini bisa menjadi sangat penting dalam banyak kasus.
  • Perintah flock dan watch tersedia di sebagian besar pemasangan Linux

kontra

  • menghentikan jenis "Layanan" ini membutuhkan dua langkah
    • mengomentari entri cron
    • bunuh skrip atau perintah watch
1
asvany

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 ().

0
Someone