Est-ce que quelqu'un sait comment trouver le pidfile de sidekiq pour le fermer en douceur? Exécuter ps ax | grep sidekiq
, puis exécuter sidekiqctl stop <pid from grep>
donne systématiquement une erreur no such pidfile
? Cntl-C et Cntl-D semblent également n'avoir aucun effet.
Fermer la fenêtre de processus et rouvrir une nouvelle fenêtre ne tue pas le processus car il semble fonctionner en tant que démon.
Le seul correctif cohérent que j'ai trouvé est le redémarrage.
Utilisez ceci pour tuer Sidekiq avec force.
ps -ef | grep sidekiq | grep -v grep | awk '{print $2}' | xargs kill -9
Sidekiq offre la possibilité de spécifier un pidfile au moment du démarrage ou, comme indiqué ci-dessous, de créer le pidfile après le démarrage du processus. Dans les deux cas, vous pouvez utiliser le fichier pidfile au moment de l’arrêt.
ps -ef | grep sidekiq
pour trouver le pidsidekiq.pid
) avec le seul contenu correspondant au pid que vous venez de trouver.sidekiqctl stop <pidfile_name>
-P <pidfile_name>
ou --pidfile <pidfile_name>
lors du prochain démarrage de sidekiqJe viens de regarder dans celui-ci moi-même ...
On dirait que les nouvelles versions de Sidekiq intègrent ceci:
https://github.com/mperham/sidekiq/wiki/Signals
kill -USR1 [PROCESS_ID]
A bien fonctionné pour moi. Les ouvriers ont cessé de chercher de nouveaux emplois, mais ont terminé ceux sur lesquels ils travaillaient, puis j'ai finalement mis fin au processus.
kill -TERM [PROCESS_ID]
J'ai écrit un petit gestionnaire qui peut démarrer ou arrêter 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
Enregistrez-le, tapez chmod +x start_stop_sidekiq.sh
. Ensuite, exécutez-le simplement avec:
bash start_stop_sidekiq.sh start /path/to/your/Rails/app
ou
bash start_stop_sidekiq.sh stop /path/to/your/Rails/app
Si vous ne possédez qu'une seule application Rails, vous pouvez également définir la variable $ PROJECT_DIR de manière statique afin que vous n'ayez pas besoin de spécifier le chemin à chaque fois. J'espère que cela t'aides!
Si vous aimez les bashes ...
scripts/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)
Remarques:
Essayez d'utiliser dieu pour surveiller sidekiq.
Ensuite, tout ce que vous avez à faire est
Alternativement, vous pouvez utiliser: Sidekiqctl stop 60
Partager un script bash qui vérifie si sidekiq est en cours d'exécution, l'envoie à TSTP pour lui demander de ne pas récupérer de nouveaux travaux, attend que tous les travaux en cours soient terminés, puis arrête le processus en envoyant un signal TERM.
https://Gist.github.com/kamilbednarz/5ea6398af2a7537aa8feb5a63f3acf2f