Bagaimana cara menjadwalkan pekerjaan server lebih cerdas daripada dengan cron?

15

Saya menjalankan pekerjaan setiap menit untuk mengindeks ulang konten situs saya.

Hari ini, mesin pencari mati, dan ketika saya login ada ratusan proses anak yatim yang dimulai oleh cron.

Apakah ada cara lain menggunakan beberapa jenis perangkat lunak yang ada yang akan membiarkan saya menjalankan pekerjaan setiap menit, tetapi itu tidak akan meluncurkan contoh lain jika pekerjaan itu tidak kembali (yaitu karena proses mesin pencari telah gagal)?

John
sumber
4
cron kemungkinan besar melakukan persis apa yang Anda katakan. Saya menyarankan untuk menulis ulang pekerjaan secara cerdas.
gparent

Jawaban:

27

Masalahnya sebenarnya bukan dengan cron - ini dengan pekerjaan Anda.

Anda perlu membuat pekerjaan Anda berinteraksi dengan kunci beberapa deskripsi. Cara termudah untuk melakukan ini adalah mencoba membuat direktori dan jika berhasil melanjutkan, jika tidak keluar. Ketika pekerjaan Anda selesai dan keluar, ia harus menghapus direktori yang siap untuk dijalankan berikutnya. Berikut ini skrip untuk diilustrasikan.

#!/bin/bash

function cleanup {
    echo "Cleanup"
    rmdir /tmp/myjob.lck
}

mkdir /tmp/myjob.lck ||  exit 1
trap cleanup EXIT
echo 'Job Running'
sleep  60
exit 0

Jalankan ini di satu terminal kemudian sebelum 60 detik habis jalankan di terminal lain itu akan keluar dengan status 1. Setelah proses pertama keluar Anda dapat menjalankannya dari terminal kedua ...

EDIT:

Ketika saya baru saja belajar tentang kawanan domba, saya pikir saya akan memperbarui jawaban ini. flock (1) mungkin lebih mudah digunakan. Dalam hal ini flock -nakan tampak tepat misalnya

* * * * * /usr/bin/flock -n /tmp/myAppLock.lck /path/to/your/job   

Akan menjalankan pekerjaan Anda setiap menit tetapi akan gagal jika kawanan tidak dapat memperoleh kunci pada file.

user9517
sumber
2
Mungkin pertanyaan bodoh, tetapi adakah keuntungan menggunakan direktori khusus daripada file biasa?
gparent
9
Menggunakan file biasa memerlukan beberapa operasi, periksa untuk melihat apakah ada, jika tidak maka buatlah. Ini menyisakan jendela peluang bagi proses lain untuk membuat file - berantakan. Mkdir adalah operasi atom yang berfungsi baik dan Anda mendapatkan 'kunci' atau tidak karena proses lain sudah memilikinya.
user9517
Masuk akal. Pemikiran bagus pada direktori kunci juga. Terima kasih
John
2

Salah satu caranya adalah membuat skrip reindex Anda membuat file kunci sehingga dapat memeriksa untuk melihat apakah sudah ada instance skrip yang sedang berjalan. Anda juga dapat menambahkan beberapa penanganan pengecualian untuk melihat apakah mesin pencari sudah aktif dan berjalan.

Alternatif yang lebih terlibat adalah dengan menggunakan semacam tugas antrian seperti Resque dan Resque-scheduler:

https://github.com/blog/542-introducing-resque

https://github.com/bvandenbos/resque-scheduler#readme

Ada juga Qu dan Sidekiq:

https://github.com/bkeepers/qu

https://github.com/mperham/sidekiq

Ya, itu saja yang berorientasi pada Ruby, tetapi Anda dapat mencari "hal-hal seperti resque" dalam bahasa pilihan Anda.

cjc
sumber
0

Cara lain untuk mengatur ini dengan cepat adalah membuat skrip shell mulai ketika mesin dinyalakan (cron dapat melakukan ini dengan ' @reboot /path/to/my/script.sh',. Kemudian restart cron untuk memulai itu) dengan sesuatu seperti ini di dalamnya.

#!/bin/sh
/opt/bin/run-site-index
sleep 60
exec $0

Script terus berjalan, dan Anda baru memulai satu - itu berapa banyak yang bisa berjalan sekaligus - tidak lebih dari itu. Beberapa kecerdasan di sana juga dapat memeriksa apakah pengindeks sedang berjalan, dan jika tidak, mulai ulang, atau coba perbaiki / beri tahu seseorang tentang masalah tersebut.

Alister Bulman
sumber
-3

Alih-alih menggunakan cron untuk ini, saya akan membangun pekerjaan Anda lebih sebagai layanan yang berjalan dalam satu lingkaran dan tidur selama 60 detik sebagai langkah terakhir, atau mungkin tidur lebih sering untuk interval yang lebih kecil di berbagai titik selama proses untuk membantu menyebarkan beban lebih merata.

Joel Coel
sumber
1
Ini tidak akan memperbaiki masalah atau perbaikan dari cron.
gparent
Itu akan memperbaiki masalah, karena hanya ada satu proses yang pernah berjalan. Itu akan menghindari cron sepenuhnya.
Joel Coel
Itu tidak memperbaiki masalah jika 'layanan' tidak terlihat jika mesin pencari berjalan. Naskah / logika pekerjaannya adalah masalahnya. EDIT: Sebenarnya, Anda agak benar, itu akan menyembunyikan masalah dengan cara yang jelek.
gparent