Как видно из прикрепленного изображения, у меня есть пара рабочих, которые, кажется, застряли. Эти процессы не должны занимать больше пары секунд.
Я не уверен, почему они не будут очищаться или как их вручную удалить.
Я использую Heroku, использую Resque с Redis-to-Go и HireFire для автоматического масштабирования рабочих.
ruby-on-rails
ruby-on-rails-3
heroku
redis
resque
Shpigford
источник
источник
Ответы:
Ни одно из этих решений у меня не сработало, я бы все равно увидел это в redis-web:
Наконец, это помогло мне очистить всех рабочих:
источник
heroku restart
похоже, помогло. Теперь он показывает правильное количество рабочих.Resque.workers.each {|w| matches = w.id.match(/^[^:]*:([0-9]*):[^:]*$/); pid = matches[1]; w.unregister_worker unless w.worker_pids.include?(pid.to_s)}
что отменит регистрацию только тех рабочих, pid которых не является частью известных работающих pid. Я не знаю, работает ли это во всех средах, но он хорошо работает в ubuntu. Это может работать, только если ваши рабочие находятся на том же компьютере, на котором вы запускаете этот код.unregister_worker
? Есть ли способ это определить?В вашей консоли:
В противном случае вы можете попытаться имитировать их как выполняемые для их удаления с помощью:
РЕДАКТИРОВАТЬ
Многие люди поддерживают этот ответ, и я считаю, что важно, чтобы люди попробовали решение hagope, которое отменяет регистрацию рабочих из очереди, тогда как приведенный выше код удаляет очереди. Если вы счастливы их подделать, тогда круто.
источник
Возможно, у вас установлен Resque Gem, так что вы можете открыть консоль и получить текущие рабочие
Возвращает список рабочих
выберите работника и
prune_dead_workers
, например, первогоисточник
Добавляя к ответу хагопа, я хотел иметь возможность отменять регистрацию только тех рабочих, которые работали в течение определенного времени. Приведенный ниже код отменяет регистрацию только тех рабочих, которые работают более 300 секунд (5 минут).
У меня есть постоянная коллекция задач Rake, связанных с Resque, к которой я также добавил: https://gist.github.com/ewherrmann/8809350
источник
Запустите эту команду везде, где вы запускали команду для запуска сервера
вы должны увидеть что-то вроде этого:
Обратите внимание на PID (идентификатор процесса) в моем примере это 92102
Затем вы можете выйти из процесса одним из двух способов.
Изящно использовать
QUIT 92102
Сильно использовать
TERM 92102
* Я не уверен в синтаксисе, либо это
QUIT 92102
либоQUIT -92102
Сообщите мне, если у вас возникнут проблемы.
источник
Я только что сделал:
Получил список рабочих.
... где n - нулевой индекс нежелательного работника.
источник
У меня была похожая проблема, что Redis сохранил БД на диск, который содержал недействительных (не работающих) рабочих. Они появлялись каждый раз при запуске Redis / resque.
Исправьте это, используя:
Убедитесь, что вы перезапустили Redis и ваши Resque worker.
источник
Вот как вы можете удалить их из Redis по имени хоста. Это случается со мной, когда я списываю сервер, и рабочие не завершаются корректно.
источник
Я столкнулся с этой проблемой и начал реализовывать здесь множество предложений. Однако я обнаружил, что основная причина этой проблемы заключалась в том, что я использовал гем redis-rb 3.3.0 . Переход на redis-rb 3.2.2 предотвратил застревание этих рабочих процессов.
источник
Недавно начал работать над https://github.com/shaiguitar/resque_stuck_queue/ . Это не решение того, как исправить застрявших рабочих, но оно решает проблему зависания / зависания в реске, поэтому я подумал, что это может быть полезно для людей в этой теме. Из README:
"Если восстановление не запускает задания в течение определенного периода времени, оно запускает предварительно определенный обработчик по вашему выбору. Вы можете использовать это, чтобы отправить электронное письмо, выполнить пейджер, добавить дополнительных рабочих, перезапустить восстановление, отправить вам текстовый текст. ... все, что тебе подходит. "
Используется в производстве и пока работает для меня довольно хорошо.
источник
У меня тоже были застрявшие / устаревшие resque-воркеры, или я должен сказать «jobs», потому что воркер на самом деле все еще там и работает нормально, это застрял разветвленный процесс.
Я выбрал жестокое решение - убить разветвленный процесс «Обработка» более 5 минут с помощью сценария bash, затем рабочий просто порождает следующий в очереди, и все продолжает работать
посмотрите мой скрипт здесь: https://gist.github.com/jobwat/5712437
источник
Я удалил их напрямую из redis-cli. К счастью, redistogo.com разрешает доступ из окружений за пределами heroku. Получите идентификатор мертвого рабочего из списка. Мой был
Запустите эту команду напрямую в Redis.
Вы можете контролировать redis db, чтобы увидеть, что он делает за кулисами.
Вторая последняя строка удаляет работника.
источник
Если вы используете более новые версии Resque, вам нужно будет использовать следующую команду, поскольку внутренние API-интерфейсы изменились ...
источник
Это позволяет избежать проблемы, если у вас установлена более новая версия восстановления, чем 1.26.0:
Имейте в виду, что это не позволяет завершить текущую работу.
источник
вы также можете использовать команду ниже, чтобы остановить всех
rescue
рабочихссылка по этой ссылке
источник