Seperti yang Anda lihat dari gambar terlampir, saya punya beberapa pekerja yang tampaknya macet. Proses-proses itu seharusnya tidak lebih dari beberapa detik.
Saya tidak yakin mengapa mereka tidak menghapus atau cara menghapusnya secara manual.
Saya menggunakan Heroku menggunakan Resque dengan Redis-to-Go dan HireFire untuk secara otomatis mengukur pekerja.
ruby-on-rails
ruby-on-rails-3
heroku
redis
resque
Shpigford
sumber
sumber
Jawaban:
Tidak ada solusi ini yang bekerja untuk saya, saya masih akan melihat ini di redis-web:
Akhirnya, ini berhasil bagi saya untuk membersihkan semua pekerja:
sumber
heroku restart
tampaknya melakukan trik. Sekarang menunjukkan jumlah pekerja yang benar.Resque.workers.each {|w| matches = w.id.match(/^[^:]*:([0-9]*):[^:]*$/); pid = matches[1]; w.unregister_worker unless w.worker_pids.include?(pid.to_s)}
yang hanya akan membatalkan registrasi pekerja yang tidak termasuk dalam pid berjalan yang dikenal. Saya tidak tahu apakah ini berfungsi di semua lingkungan tetapi berfungsi baik di ubuntu. Ini mungkin hanya bekerja ketika pekerja Anda berada di mesin yang sama dengan Anda menjalankan kode ini.unregister_worker
? Apakah ada cara untuk menentukan ini?Di konsol Anda:
Kalau tidak, Anda dapat mencoba memalsukannya dengan menghapusnya, dengan:
EDIT
Banyak orang telah memperbaiki jawaban ini dan saya merasa bahwa penting bagi orang untuk mencoba solusi hagope yang membatalkan pendaftaran pekerja dari antrian, sedangkan kode di atas menghapus antrian. Jika Anda senang memalsukannya, maka dinginkan.
sumber
Anda mungkin memasang permata resque, sehingga Anda dapat membuka konsol dan mendapatkan pekerja saat ini
Ini mengembalikan daftar pekerja
pilih pekerja dan
prune_dead_workers
, misalnya yang pertamasumber
Menambahkan untuk menjawab dengan hagope, saya ingin hanya dapat membatalkan pendaftaran pekerja yang telah berjalan selama waktu tertentu. Kode di bawah ini hanya akan membatalkan pendaftaran pekerja yang berjalan selama lebih dari 300 detik (5 menit).
Saya memiliki koleksi tugas Rake terkait Resque yang sedang berlangsung yang juga telah saya tambahkan ini ke: https://gist.github.com/ewherrmann/8809350
sumber
Jalankan perintah ini di mana pun Anda menjalankan perintah untuk memulai server
Anda akan melihat sesuatu seperti ini:
Catat PID (id proses) dalam contoh saya itu adalah 92102
Kemudian Anda dapat keluar dari proses 1 dari 2 cara.
Gunakan dengan anggun
QUIT 92102
Gunakan dengan paksa
TERM 92102
* Saya tidak yakin sintaks itu baik
QUIT 92102
atauQUIT -92102
Beri tahu saya jika Anda memiliki masalah.
sumber
Saya baru saja melakukannya:
Punya daftar pekerja.
... di mana n adalah indeks berbasis nol dari pekerja yang tidak diinginkan.
sumber
Saya memiliki masalah yang sama yaitu Redis menyimpan DB ke disk yang menyertakan pekerja yang tidak valid (tidak berjalan). Setiap kali Redis / resque dimulai mereka muncul.
Perbaiki ini menggunakan:
Pastikan Anda memulai ulang Redis dan pekerja Resque Anda.
sumber
Inilah cara Anda dapat membersihkan mereka dari Redis dengan nama host. Ini terjadi pada saya ketika saya menonaktifkan server dan pekerja tidak keluar dengan anggun.
sumber
Saya mengalami masalah ini dan mulai menerapkan banyak saran di sini. Namun, saya menemukan akar penyebab yang menciptakan masalah ini adalah bahwa saya menggunakan permata redis-rb 3.3.0 . Penurunan peringkat ke redis-rb 3.2.2 mencegah para pekerja ini terjebak di tempat pertama.
sumber
Mulai bekerja di https://github.com/shaiguitar/resque_stuck_queue/ baru-baru ini. Ini bukan solusi untuk bagaimana memperbaiki pekerja yang macet tetapi ini membahas masalah resque hanging / macet, jadi saya pikir itu bisa bermanfaat bagi orang-orang di utas ini. Dari README:
"Jika resque tidak menjalankan pekerjaan dalam jangka waktu tertentu, itu akan memicu penangan pilihan Anda yang telah ditentukan sebelumnya. Anda dapat menggunakan ini untuk mengirim email, tugas pager, menambahkan lebih banyak pekerja resque, memulai kembali resque, mengirimi Anda txt. ..apa pun yang cocok untukmu. "
Telah digunakan dalam produksi dan bekerja dengan cukup baik untuk saya sejauh ini.
sumber
Saya telah terjebak / basi resque pekerja di sini juga, atau haruskah saya mengatakan 'pekerjaan', karena pekerja itu sebenarnya masih ada dan berjalan dengan baik, itu proses bercabang yang macet.
Saya memilih solusi brutal untuk membunuh proses bercabang "Memproses" sejak lebih dari 5 menit, melalui skrip bash, maka pekerja hanya menelurkan berikutnya dalam antrian, dan semuanya terus berjalan
lihat skrip saya di sini: https://gist.github.com/jobwat/5712437
sumber
Saya sudah membersihkan mereka dari redis-cli secara langsung. Untungnya redistogo.com memungkinkan akses dari lingkungan di luar heroku. Dapatkan ID pekerja yang sudah mati dari daftar. Milik saya
Jalankan perintah ini dengan redis secara langsung.
Anda dapat memonitor redis db untuk melihat apa yang dilakukannya di balik layar.
Baris terakhir kedua menghapus pekerja.
sumber
Jika Anda menggunakan versi Resque yang lebih baru, Anda harus menggunakan perintah berikut karena API internal telah berubah ...
sumber
Ini menghindari masalah selama Anda memiliki versi resque yang lebih baru dari 1.26.0:
Perlu diingat bahwa itu tidak membiarkan pekerjaan yang sedang berjalan selesai.
sumber
Anda juga dapat menggunakan perintah di bawah ini untuk menghentikan semua
rescue
pekerjareferensi dari tautan ini
sumber