Comment puis-je arrêter redis-server?

335

J'ai apparemment une redis-serverinstance en cours d'exécution car lorsque j'essaie de démarrer un nouveau serveur en entrant redis-server, je suis accueilli par les éléments suivants:

Opening port: bind: Address already in use

Je n'arrive pas à comprendre comment arrêter ce serveur et en démarrer un nouveau.

Y a-t-il une commande à laquelle je peux ajouter redis-serverlorsque je tape dans la CLI?

Mon système d'exploitation est Ubuntu 10.04.

Qcom
la source
Quel système d'exploitation et quelle distribution utilisez-vous?
yojimbo87
Mesdames et messieurs, si vous n'avez pas installé redis via le gestionnaire de paquets, et que vous l'avez installé à partir des sources, cela peut ne pas fonctionner avec systemv ou upstart ou systemd sur ubuntu. Ainsi, la réponse sélectionnée ne fonctionnera pas par défaut. La deuxième réponse, qui n'est pas indiquée comme correcte, semble être plus fiable.
Donato
Astuce: tester si un serveur Redis est en cours d'exécution peut être effectué via redis-cli ping. Un serveur Redis en cours d'exécution répondra par PONG.
Jochem Schulenklopper

Réponses:

555

Connectez-vous à l'instance de nœud et utilisez la commande d' arrêt ou si vous êtes sur ubuntu, vous pouvez essayer de redémarrer le serveur redis via init.d:

/etc/init.d/redis-server restart

ou l'arrêter / démarrer:

/etc/init.d/redis-server stop
/etc/init.d/redis-server start

Sur Mac

redis-cli shutdown
yojimbo87
la source
5
Vous ne pouvez le faire que si vous configurez redis de cette façon. La réponse de Kevin McTigue fonctionne avec une configuration minimale.
btk
1
Sur OS X, vous devrez probablement utiliser launchctlpour ce faire, et sur d'autres systèmes, systemctlou service.
tadman
1
Sur certaines machines sudo /etc/init.d/redis stop fonctionnera
TroodoN-Mike
4
Sur Ubuntu moderne, j'utilise service redis-server stopet service redis-server start, après l'avoir installé avec apt-get install redis-server.
Cloud Artisans du
1
Cela ne fonctionne que si vous avez un serveur redis exécuté en tant que service. S'il s'exécute en tant qu'exécutable autonome, vous devrez alors arrêter explicitement le processus. Voici les étapes que j'ai utilisées pour arrêter le processus: pkill redis-server sur une boîte linux
199

Un moyen plus propre et plus fiable consiste à entrer dans redis-cli puis à taper shutdown

Dans redis-cli, tapez help @serveret vous verrez ceci vers le bas de la liste:

SHUTDOWN - résumé: enregistrer de manière synchrone l'ensemble de données sur le disque, puis arrêter le serveur depuis: 0,07

Et si vous avez une instance de redis-server en cours d'exécution dans un terminal, vous verrez ceci:

User requested shutdown...
[6716] 02 Aug 15:48:44 * Saving the final RDB snapshot before exiting.
[6716] 02 Aug 15:48:44 * DB saved on disk
[6716] 02 Aug 15:48:44 # Redis is now ready to exit, bye bye...
Kevin McTigue
la source
73
Ou ne lancez même pas redis-cli. Envoyez-le simplement depuis la ligne de commande via redis-cli shutdown. (vous pouvez envoyer n'importe quelle commande comme celle-ci, par exemple redis-cli set cat dog; redis-cli get cat)
JesseBuesking
6
La seule mise en garde au commentaire de @jessebuesking est que si vous avez configuré la protection par mot de passe, les redis-cli set cat dog; redis-cli get catmodifications apportées à redis-cli -a mypassword set cat dog; redis-cli -a mypassword get cat, ce qui peut être ennuyeux après quelques commandes.
glarrain
@glarrain une chose que vous pourriez faire pour éviter la redondance est de définir un alias pour votre session bash actuelle, par exemple alias redis-cli="redis-cli -a mypassword". De cette façon, vous pouvez effectuer les appels comme dans mon commentaire d'origine sans avoir à ressaisir votre mot de passe à chaque utilisation.
JesseBuesking
@jessebuesking très créatif! N'aurait pas pensé à une solution. Pour une raison quelconque, j'ai un peu peur de mettre des mots de passe dans des fichiers de configuration
glarrain
@glarrain ne me croyez pas sur parole, mais je pense que cela ne le stockera qu'en mémoire pour la session en cours (aka ne l'ajoutez pas à votre bashrc ou bash_profile, entrez-le tel quel à partir de votre invite).
JesseBuesking
141

redis-cli shutdownest le plus efficace. La réponse acceptée ne fonctionne pas pour moi (OSX Lion). Merci, @JesseBuesking.

SimplGy
la source
oui, la réponse acceptée ne fonctionne que pour les systèmes Linux avec Redis configuré en tant que service de la manière illustrée
glarrain
2
Cela fonctionne également sous Windows. redis-cli.exe shutdown
Brandon Boone
Comme je l'ai mentionné ci-dessus, il est dommage que cette méthode (plutôt évidente) soit si difficile à trouver. Je m'attendais à ce que cela redis-cli --helpaurait pu couvrir cette affaire.
Jochem Schulenklopper
42

Pour OSX, j'ai créé les alias suivants pour démarrer et arrêter redis(installé avec Homebrew):

alias redstart='redis-server /usr/local/etc/redis/6379.conf'
alias redstop='redis-cli -h 127.0.0.1 -p 6379 shutdown'

Cela a très bien fonctionné pour le développement local!

Homebrew a maintenant homebrew-servicesqui peut être utilisé pour démarrer, arrêter et redémarrer les services. homebrew-services

brew services est automatiquement installé lors de l'exécution.

brew services start|run redis 
brew services stop redis
brew services restart redis

Si vous utilisez run, il ne démarrera pas lors de la connexion (ni au démarrage). startdémarre le redisservice et l'ajoute lors de la connexion et du démarrage.

Ray Hunter
la source
3
Si vous avez installé redis en utilisant homebrew, ça brew services stop redismarche aussi! :)
Edouard Berthe
Je recommanderais d'utiliser les services de brassage maintenant pour gérer le démarrage et l'arrêt pour les valeurs par défaut. Si vous avez besoin d'un peu plus de contrôle, il existe également d'autres options.
Ray Hunter
1
C'est la meilleure réponse car elle fonctionne sur toutes les versions Linux et Mac, y compris celles installées en utilisant apt, yum, brew ou download. Qu'ils aient des scripts upstart ou init ou system d ou non. Merci
doesnt_matter
1
J'aime le nom des alias :) Cool!
thinklinux
1
que dois-je faire si je veux redémarrer et ne pas arrêter @RayHunter
AATHITH RAJENDRAN
25

Tapez SHUTDOWNle CLI

ou

si vous ne vous souciez pas de vos données en mémoire, vous pouvez également taper SHUTDOWN NOSAVEpour forcer l'arrêt du serveur.

user1651082
la source
16

Essayez killall redis-server. Vous pouvez également utiliser ps auxpour trouver le nom et le pid de votre serveur, puis le tuer avec kill -9 here_pid_number.

ciembor
la source
C'est super, fonctionne sur mac / unix. (Testé Mac, approuvé Unix)
ThomasReggi
24
Mauvaise idée de tuer un serveur DB. Préférez toujours un arrêt correct, ou du moins, tuez -15 au lieu de tuer -9.
Zsolt Szilagyi
2
@ZsoltSzilagy, vous devez fournir un lien ou une explication expliquant pourquoi c'est une mauvaise idée. Comme la façon dont redis effectue les écritures différées, de sorte qu'il y aura toujours des données non validées en mémoire.
notbad.jpeg
5
@ notbad.jpeg, bien sûr, vous pouvez également laisser tomber votre ordinateur par terre. Si la table est suffisamment haute, cela devrait également arrêter le serveur. Ai-je besoin d'un lien ou d'une explication pour expliquer pourquoi c'est une mauvaise idée?
osa
2
Avec cette méthode, vous ne pensez pas à l'état de la base de données redis. Vous utilisez une fonctionnalité du système d'exploitation pour arrêter une application au lieu d'utiliser l'application elle-même ou un démon, qui utilise probablement également la fonctionnalité d'application. Cette solution revient à débrancher le câble pour éteindre le téléviseur.
Jesus
15

Option 1: accédez au répertoire d'installation de redis et accédez src, dans mon cas:

/opt/redis3/src/redis-cli -p 6379 shutdown

où 6379 est le port par défaut.

Option 2: trouver le processus redis et tuer

ps aux | grep redis-server

t6b3fg   22292  0.0  0.0 106360  1588 pts/0    S+   01:19   0:00 /bin/sh /sbin/service redis start
t6b3fg   22299  0.0  0.0  11340  1200 pts/0    S+   01:19   0:00 /bin/sh /etc/init.d/redis start

Et ensuite lancer la mise à mort:

kill -9 22292

kill -9 22299

J'utilise Centos 6.7, x86_64

J'espère que ça aide

App Work
la source
12

arrêter le type de serveur redis dans le terminal avec l'utilisateur root

sudo service redis-server stop

le message sera affiché après l'arrêt du serveur redis

Stopping redis-server: redis-server.

si vous voulez démarrer le type de serveur redis

sudo service redis-server start

si vous souhaitez redémarrer le type de serveur

sudo service redis-server restart
denny
la source
Je me demande si cela est toujours valable pour les nouvelles versions de Redis si elles sont configurées par défaut. L'émission service --status-allne montrera pas redis, donc toute servicecommande échouera redis-server. Mais redis apparaît ps -ef. Je ne trouve tout simplement aucun document connexe.
themefield
Looks sur Ubuntu 18.04 sudo service redis start/stop/statusfait de même, les deux vont.
frmbelz
10

Une autre façon pourrait être:

ps -ef | grep -i 'redis-server'
kill -9 PID owned by redis

Fonctionne sur * NIX & OSX

smace
la source
1
@JoenasE, non, cela ne devrait pas être la réponse acceptée IMO. Le fait que le système d'exploitation tue un processus en cours d'exécution néglige le cas où l'application pourrait avoir des données en mémoire non encore enregistrées dans un magasin plus persistant. L'arrêt de l'application via une méthode fournie par l'application est de préférence une meilleure option.
Jochem Schulenklopper
6

MacOSX - Cela a fonctionné :)

Étape 1: rechercher le serveur Redis précédemment exécuté

ps auxx | grep redis-server

Étape 2: tuer le processus spécifique en trouvant le PID (ID de processus) - Redis Sever

kill -9 PID
Karthekeyan Devanand
la source
5

Si vous savez sur quel port il serait exécuté (par défaut, ce serait 6379), vous pouvez utiliser la commande ci-dessous pour obtenir le pid du processus utilisant ce port, puis exécuter la commande kill pour le même pid.

sudo lsof -i : <port> | awk '{print $2}'

la commande ci-dessus vous donnera pid.

tuer <pid>;

Cela arrêterait votre serveur.

cptjack
la source
5

systemd, ubuntu 16.04:

$ sudo systemctl is-active redis-server
active

$ sudo systemctl is-enabled redis-server
enabled

$ sudo systemctl disable redis-server
Synchronizing state of redis-server.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install disable redis-server
Removed /etc/systemd/system/redis.service.

$ sudo systemctl stop redis-server
Adobe
la source
5

Habituellement, ce problème survient après avoir éteint mon ordinateur (ou laissé fonctionner) de manière irrégulière. Je crois que le port reste bloqué ouvert, tandis que le processus s'arrête mais continue d'être lié au port précédent.

9/10 fois le correctif peut être:

$ ps aux | grep redis

-> MyUser 2976  0.0  0.0  2459704    320   ??  S    Wed01PM   0:29.94 redis-server *:6379

$ kill 2976

$ redis-server

C'est bon.

SerKnight
la source
3

Dans mon cas, c'était:

/etc/init.d/redismaster stop
/etc/init.d/redismaster start

Pour connaître le nom de votre service, vous pouvez exécuter:

sudo updatedb
locate redis

Et il vous montrera tous les fichiers Redis de votre système.

joan16v
la source
3

si vous avez fait installer (par exemple ubuntu) lors de l'installation de redis, vous pouvez faire:

redis-cli shutdown

comme l'a souligné @ yojimbo87 :)

gia huy
la source
2

Une autre façon pourrait être:

brew services stop redis
Ihor Pavlyk
la source
+10 pour cela, cela fonctionne sans excuses sur mac! cela fonctionne aussi ™ les services de brassage démarrent redis ™ ¢ les services de brassage redémarrent redis ¢
Victor.Uduak
2

La suite a fonctionné pour moi sur MAC

 ps aux | grep 'redis-server' | awk '{print $2}' | xargs sudo kill -9
Mahesh Hegde
la source
2

Si vous exécutez redis dans un conteneur Docker, aucune des réponses actuelles n'aidera. Vous devez arrêter le conteneur redis. Sinon, le processus redis continuera de réapparaître.

$ docker ps
CONTAINER ID        IMAGE                    PORTS                             
e1c008ab04a2        bitnami/redis:4.0.8-r0   0.0.0.0:6379->6379/tcp

$ docker stop e1c008ab04a2
e1c008ab04a2
Wladek Surala
la source
2

Si vous savez sur quel port (par défaut: 6379) votre serveur redis fonctionne, vous pouvez aller avec l' option 1 ou vous pouvez vérifier votre processus redis et vous pouvez tuer avec l' option 2

option 1:
tuer le processus sur le port:

check     : sudo lsof -t -i:6379
kill      : sudo kill `sudo lsof -t -i:6379`

option 2:
recherchez le serveur Redis précédemment exécuté:

 ps auxx | grep redis-server

Tuez le processus spécifique en trouvant le PID (ID de processus) - Redis Sever

kill -9 PID

Démarrez maintenant votre serveur redis avec

redis-server /path/to/redis.conf 
AATHITH RAJENDRAN
la source
1

Je ne sais pas spécifiquement pour redis, mais pour les serveurs en général:

Quel OS ou distribution? Souvent, il y aura une commande stop ou /etc/init.d / ... qui pourra rechercher le pid existant dans un fichier pid.

Vous pouvez rechercher quel processus est déjà lié au port avec sudo netstat -nlpt(options linux; les autres versions de netstat varieront) et lui signaler de s'arrêter. Je ne l' utiliserais paskill -9 sur un serveur en cours d'exécution à moins qu'il n'y ait vraiment aucun autre signal ou méthode pour l'arrêter.

ysth
la source
1

Les commandes ci-dessous fonctionnent pour moi sur Ubuntu Server

$ service /etc/init.d/redis_6379 stop
$ service /etc/init.d/redis_6379 start
$ service /etc/init.d/redis_6379 restart
efkan
la source
0

Sur MacOSX,

C'est ce qui a fonctionné pour moi

/etc/init.d/redis restart

/etc/init.d/redis stop

/etc/init.d/redis start
tsuz
la source
0

Une chose à vérifier si les commandes redis ne fonctionnent pas pour vous est de savoir si votre redis-server.pid est réellement en cours de création. Vous spécifiez l'emplacement de l'emplacement de ce fichier

/etc/systemd/system/redis.service 

et il devrait avoir une section qui ressemble à ceci:

[Service]
Type=forking
User=redis
Group=redis
ExecStart=/usr/bin/redis-server /etc/redis/redis.conf
PIDFile=/run/redis/redis-server.pid
TimeoutStopSec=0
Restart=always

Vérifiez l'emplacement et les autorisations du répertoire PIDFile (dans mon cas, '/ run / redis'). J'essayais de redémarrer le service connecté en tant que déploiement mais les autorisations de répertoire étaient répertoriées comme

drwxrwsr-x  2 redis    redis      40 Jul 20 17:37 redis

Si vous avez besoin d'une mise à jour sur les autorisations Linux, vérifiez cela . Mais le problème était que j'exécutais le redémarrage en tant qu'utilisateur de déploiement dont les autorisations ci-dessus sont rx, ne permettant pas à mon utilisateur d'écrire dans le répertoire PIDFile.

Une fois que j'ai réalisé cela, je me suis connecté en utilisant root, relancez la commande de redémarrage sur le redis ( service redis restart) et tout a fonctionné. C'était un casse-tête mais j'espère que cela fait gagner un peu de temps à quelqu'un.

Lauren Marie Lahm
la source
0

Redis a un paramètre de configuration pidfile(par exemple /etc/redis.conf - vérifiez le code source de redis ), par exemple:

# If a pid file is specified, Redis writes it where specified at startup
# and removes it at exit.
#
# When the server runs non daemonized, no pid file is created if none is
# specified in the configuration. When the server is daemonized, the pid file
# is used even if not specified, defaulting to "/var/run/redis.pid".
#
pidfile /var/run/redis.pid

Si elle est définie ou pourrait l'être, au lieu de rechercher l'ID de processus (pid) en utilisant ps + grepquelque chose comme ceci, vous pouvez utiliser:

kill $(cat /var/run/redis.pid)

Si nécessaire, on peut faire un script d'arrêt redis comme ceci ( script d'init.d redis 5.0 par défaut adapté dans le code source de redis ):

PIDFILE=/var/run/redis.pid
if [ ! -f $PIDFILE ]
then
    echo "$PIDFILE does not exist, process is not running"
else
    PID=$(cat $PIDFILE)
    echo "Stopping ..."
    kill $PID
    while [ -x /proc/${PID} ]
    do
        echo "Waiting for Redis to shutdown ..."
        sleep 1
    done
    echo "Redis stopped"
fi
Robert Lujo
la source