Ответ 1
Используйте это, чтобы принудительно убить sidekiq.
ps -ef | grep sidekiq | grep -v grep | awk '{print $2}' | xargs kill -9
Кто-нибудь знает, как найти sidekiq pidfile, чтобы изящно закрыть его?
Запуск ps ax | grep sidekiq
, а затем запуск sidekiqctl stop <pid from grep>
последовательно дает ошибку no such pidfile
?
Cntl-C и Cntl-D также не имеют эффекта.
Закрытие окна процесса и повторное открытие нового окна не убивают процесс, поскольку он работает как демон.
Единственное постоянное исправление, которое я нашел, перезагружается.
Используйте это, чтобы принудительно убить sidekiq.
ps -ef | grep sidekiq | grep -v grep | awk '{print $2}' | xargs kill -9
Sidekiq предоставляет возможность указывать pidfile во время запуска или, как показано ниже, для создания pidfile после запуска процесса. В любом случае вы можете использовать pidfile в момент остановки.
ps -ef | grep sidekiq
, чтобы найти pidsidekiq.pid
) с единственным содержимым, которое вы только что нашлиsidekiqctl stop <pidfile_name>
-P <pidfile_name>
или --pidfile <pidfile_name>
при запуске sidekiq в будущемПросто посмотрел на это сам...
Похоже, что более новые версии Sidekiq имеют встроенный интерфейс:
https://github.com/mperham/sidekiq/wiki/Signals
kill -USR1 [PROCESS_ID]
Работал отлично для меня. Рабочие перестали собирать новые рабочие места, но закончили те, на которых они были, затем я, наконец, убил процесс, когда это было сделано.
kill -TERM [PROCESS_ID]
Я написал небольшой обработчик, который может запускать или останавливать sidekiq.
start_stop_sidekiq.sh
#!/bin/bash
cmd=$1
PROJECT_DIR=$2
PIDFILE=$PROJECT_DIR/tmp/pids/sidekiq.pid
cd $PROJECT_DIR
start_function(){
LOGFILE=$PROJECT_DIR/log/sidekiq.log
echo "Starting sidekiq..."
bundle exec sidekiq -d -L $LOGFILE -P $PIDFILE -q mailer,5 -q default -e production
}
stop_function(){
if [ ! -f $PIDFILE ]; then
ps -ef | grep sidekiq | grep busy | grep -v grep | awk '{print $2}' > $PIDFILE
fi
bundle exec sidekiqctl stop $PIDFILE
}
case "$cmd" in
start)
start_function
;;
stop)
stop_function
;;
restart)
stop_function && start_function;
;;
*)
echo $"Usage: $0 {start|stop|restart} /path/to/rails/app"
esac
Сохраните его, введите chmod +x start_stop_sidekiq.sh
.
Затем просто запустите его с помощью:
bash start_stop_sidekiq.sh start /path/to/your/rails/app
или
bash start_stop_sidekiq.sh stop /path/to/your/rails/app
Если у вас есть только одно приложение Rails, вы также можете установить переменную $PROJECT_DIR статически, чтобы вам не нужно указывать путь каждый раз. Надеюсь, это поможет!
Если вам нравятся bashes...
Сценарии /stop _sidekiq.sh
#!/bin/bash
DIR="$( cd "$( dirname "$0" )" && pwd )"
PROJECT_DIR=$DIR/../ # EDIT HERE: rel path to your project form this file location (my scripts are in ./scripts/)
SIDEKIQ_PID_FILE=$PROJECT_DIR/tmp/pids/sidekiq.pid # EDIT HERE: pid file location
if [ ! -f $SIDEKIQ_PID_FILE ]; then
# if no pid file, retrieve pid and create file
ps -ef | grep sidekiq | grep busy | grep -v grep | awk '{print $2}' > $SIDEKIQ_PID_FILE
fi
(cd $PROJECT_DIR && bundle exec sidekiqctl stop $SIDEKIQ_PID_FILE)
Примечания:
Попробуйте использовать бог для мониторинга sidekiq.
Затем все, что вам нужно сделать, это bundle exec god stop
В качестве альтернативы вы можете использовать: sidekiqctl stop 60