Подтвердить что ты не робот

Изящное закрытие сторонних процессов

Кто-нибудь знает, как найти sidekiq pidfile, чтобы изящно закрыть его? Запуск ps ax | grep sidekiq, а затем запуск sidekiqctl stop <pid from grep> последовательно дает ошибку no such pidfile? Cntl-C и Cntl-D также не имеют эффекта.

Закрытие окна процесса и повторное открытие нового окна не убивают процесс, поскольку он работает как демон.

Единственное постоянное исправление, которое я нашел, перезагружается.

4b9b3361

Ответ 1

Используйте это, чтобы принудительно убить sidekiq.

ps -ef | grep sidekiq | grep -v grep | awk '{print $2}' | xargs kill -9

Ответ 2

Sidekiq предоставляет возможность указывать pidfile во время запуска или, как показано ниже, для создания pidfile после запуска процесса. В любом случае вы можете использовать pidfile в момент остановки.

  • Используйте ps -ef | grep sidekiq, чтобы найти pid
  • Создайте файл (например, sidekiq.pid) с единственным содержимым, которое вы только что нашли
  • sidekiqctl stop <pidfile_name>
  • Используйте -P <pidfile_name> или --pidfile <pidfile_name> при запуске sidekiq в будущем

Ответ 3

Просто посмотрел на это сам...

Похоже, что более новые версии Sidekiq имеют встроенный интерфейс:

https://github.com/mperham/sidekiq/wiki/Signals

kill -USR1 [PROCESS_ID]

Работал отлично для меня. Рабочие перестали собирать новые рабочие места, но закончили те, на которых они были, затем я, наконец, убил процесс, когда это было сделано.

kill -TERM [PROCESS_ID]

Ответ 4

Я написал небольшой обработчик, который может запускать или останавливать 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 статически, чтобы вам не нужно указывать путь каждый раз. Надеюсь, это поможет!

Ответ 5

Если вам нравятся 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 запускается без аргумента pid file
  • предполагает, что этот script находится в папке внутри проекта, а файлы pid хранятся в. /tmp/pids/

Ответ 6

Попробуйте использовать бог для мониторинга sidekiq.

Затем все, что вам нужно сделать, это bundle exec god stop

В качестве альтернативы вы можете использовать: sidekiqctl stop 60