Come posso interrompere redis-server?


335

Apparentemente ho redis-serverun'istanza in esecuzione perché quando provo ad avviare un nuovo server inserendo redis-server, sono accolto con il seguente:

Opening port: bind: Address already in use

Non riesco a capire come fermare questo server e avviarne uno nuovo.

C'è un comando che posso aggiungere redis-serverquando scrivo nella CLI?

Il mio sistema operativo è Ubuntu 10.04.


Quale sistema operativo e distribuzione stai usando?
yojimbo87,

Onorevoli colleghi, se non avete installato redis tramite il gestore dei pacchetti e lo avete installato dal sorgente, potrebbe non funzionare con systemv o upstart o systemd su ubuntu. Pertanto, la risposta selezionata non funzionerà per impostazione predefinita. La seconda risposta, che non è contrassegnata come corretta, sembra essere più affidabile.
Donato,

Suggerimento: è possibile verificare se un server Redis è in esecuzione tramite redis-cli ping. Un server Redis in esecuzione risponderà con PONG.
Jochem Schulenklopper,

Risposte:


555

Connettiti all'istanza del nodo e usa il comando shutdown o se sei su Ubuntu puoi provare a riavviare il server redis tramite init.d:

/etc/init.d/redis-server restart

oppure fermalo / avvialo:

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

Su Mac

redis-cli shutdown

5
Puoi farlo solo se hai impostato redis in quel modo. La risposta di Kevin McTigue funziona con una configurazione minima.
BTK

1
Su OS X probabilmente dovrai usare launchctlquesto, e su altri sistemi, systemctlo service.
Tadman,

1
Su alcune macchine sudo /etc/init.d/redis stop funzionerà
TroodoN-Mike

4
Su Ubuntu moderno, uso solo service redis-server stope service redis-server start, dopo averlo installato con apt-get install redis-server.
Cloud Artisans,

1
Funziona solo se hai redis-server in esecuzione come servizio. Se è in esecuzione come eseguibile autonomo, dovrai interrompere esplicitamente il processo. Ecco i passaggi che ho usato per interrompere il processo: pkill redis-server su un box linux

199

Un modo più pulito e affidabile è quello di andare in redis-cli e quindi digitare shutdown

In redis-cli, digita help @servere vedrai questo nella parte inferiore dell'elenco:

SHUTDOWN - riepilogo: salva in modo sincrono il set di dati su disco e quindi spegni il server da: 0.07

E se hai un'istanza redis-server in esecuzione in un terminale, vedrai questo:

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...

73
O non avviare nemmeno redis-cli. Basta inviarlo dalla riga di comando tramite redis-cli shutdown. (puoi inviare qualsiasi comando come questo, per esempio redis-cli set cat dog; redis-cli get cat)
JesseBuesking

6
L'unico avvertimento al commento di @jessebuesking è che se hai impostato la protezione con password, redis-cli set cat dog; redis-cli get catcambia in redis-cli -a mypassword set cat dog; redis-cli -a mypassword get cat, che può essere fastidioso dopo alcuni comandi.
Glarrain,

@glarrain una cosa che potresti fare per evitare la ridondanza è impostare un alias per la tua sessione bash corrente, per esempio alias redis-cli="redis-cli -a mypassword". In questo modo è possibile effettuare chiamate come nel mio commento originale senza dover fornire nuovamente la password ad ogni utilizzo.
JesseBuesking,

@jessebuesking molto creativo! Non avrei pensato alla soluzione. Per qualche ragione ho un po 'paura di mettere le password nei file di configurazione
glarrain

@glarrain non crederci sulla parola, ma penso che questo lo salverà in memoria solo per la sessione corrente (ovvero non aggiungerlo al tuo bashrc o bash_profile, inseriscilo così com'è dal tuo prompt).
JesseBuesking,

141

redis-cli shutdownè più efficace. La risposta accettata non funziona per me (OSX Lion). Grazie, @JesseBuesking.


sì, la risposta accettata funziona solo per i sistemi Linux con Redis impostato come servizio nel modo illustrato
glarrain

2
Questo funziona anche su Windows. redis-cli.exe shutdown
Brandon Boone,

Come ho accennato in precedenza, è un peccato che questo metodo (piuttosto ovvio) sia così difficile da trovare. Mi aspettavo che redis-cli --helpavrebbe potuto coprire questo caso.
Jochem Schulenklopper,

42

Per OSX, ho creato i seguenti alias per l'avvio e l'arresto redis(installato con Homebrew):

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

Questo ha funzionato benissimo per lo sviluppo locale!

Ora Homebrew homebrew-servicespuò essere utilizzato per avviare, arrestare e riavviare i servizi. homebrew-services

brew services viene installato automaticamente quando eseguito.

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

Se lo usi run, non lo avvierà al login (né all'avvio). startavvierà il redisservizio e lo aggiungerà al login e all'avvio.


3
Se hai installato redis usando homebrew, brew services stop redisfunziona anche! :)
Edouard Berthe,

Consiglierei di utilizzare i servizi di infusione ora per gestire l'avvio e l'arresto delle impostazioni predefinite. Se hai bisogno di un po 'più di controllo, ci sono anche altre opzioni.
Ray Hunter,

1
Questa è la risposta migliore in quanto funziona su tutti i tipi di Linux e Mac, inclusi quelli installati usando apt, yum, brew o download. Sia che abbiano upstart o init o script di sistema o no. Grazie
doesnt_matter

1
Mi piace il nome degli alias :) Cool!
thinklinux,

1
cosa devo fare se voglio riavviare e non chiudere @RayHunter
AATHITH RAJENDRAN

25

Digitare SHUTDOWNla CLI

o

se non ti interessano i tuoi dati in memoria, puoi anche digitare SHUTDOWN NOSAVEper forzare l'arresto del server.


16

Prova killall redis-server. Puoi anche usare ps auxper trovare il nome e il pid del tuo server, e poi ucciderlo con kill -9 here_pid_number.


Questo è fantastico, funziona su mac / unix. (Mac test, approvazione unix)
ThomasReggi il

24
Cattiva idea di uccidere duramente un server DB. Preferisci sempre un corretto spegnimento, o almeno, uccidi -15 invece di uccidere -9.
Zsolt Szilagyi

2
@ZsoltSzilagy dovresti fornire un link o una spiegazione del perché è una cattiva idea. Come il redis fa ritardare le scritture, in modo che ci siano ancora dati non sottoposti a commit in memoria.
notbad.jpeg,

5
@ notbad.jpeg, ovviamente, puoi anche far cadere il tuo computer sul pavimento. Se la tabella è abbastanza alta, anche questo dovrebbe arrestare il server. Ho bisogno di un link o di una spiegazione del perché questa è una cattiva idea?
osa,

2
Con questo metodo non stai pensando allo stato del database redis. Stai utilizzando una funzionalità del sistema operativo per arrestare un'applicazione anziché utilizzare l'applicazione stessa o un demone, che probabilmente utilizza anche la funzionalità dell'applicazione. Questa soluzione è come scollegare il cavo per spegnere la TV.
Gesù,

15

Opzione 1: vai alla directory di installazione di redis e vai src, nel mio caso:

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

dove 6379 è la porta predefinita.

Opzione 2: trova il processo redis e uccidi

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

E poi inizia a uccidere:

kill -9 22292

kill -9 22299

Sto usando Centos 6.7, x86_64

spero che sia d'aiuto


12

interrompere il tipo di server redis nel terminale con l'utente root

sudo service redis-server stop

il messaggio verrà visualizzato dopo l'arresto del server redis

Stopping redis-server: redis-server.

se si desidera avviare il tipo di server redis

sudo service redis-server start

se si desidera riavviare il tipo di server

sudo service redis-server restart

Mi chiedo se questo sia ancora valido per le nuove versioni di Redis se configurato per impostazione predefinita. L'emissione service --status-allnon mostrerà redis, quindi qualsiasi servicecomando fallirà redis-server. Ma redis si presenta ps -ef. Non riesco proprio a trovare alcun documento correlato.
themefield,

Sembra che Ubuntu 18.04 sudo service redis start/stop/statusfaccia lo stesso, entrambi vanno.
venerdì

10

Un altro modo potrebbe essere:

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

Funziona su * NIX e OSX


1
@JoenasE, no, questa non dovrebbe essere la risposta accettata IMO. Fare in modo che il sistema operativo uccida un processo in esecuzione trascura il caso in cui l'applicazione potrebbe avere alcuni dati in memoria non ancora salvati in un archivio più persistente. L'arresto dell'applicazione tramite un metodo fornito dall'applicazione è preferibilmente un'opzione migliore.
Jochem Schulenklopper,

6

MacOSX - Funzionava :)

Passaggio 1: trova il server Redis precedentemente in esecuzione

ps auxx | grep redis-server

Step 2: Termina il processo specifico trovando PID (Process ID) - Redis Sever

kill -9 PID

5

Se sai su quale porta sarebbe in esecuzione (per impostazione predefinita sarebbe 6379), puoi usare il comando seguente per ottenere il pid del processo usando quella porta e quindi eseguire il comando kill per lo stesso pid.

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

il comando sopra ti darà pid.

uccidere <pid>;

Ciò arresterebbe il tuo server.


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

5

Di solito questo problema si presenta dopo aver spento il computer (o aver lasciato in esecuzione) in modo irregolare. Credo che la porta rimanga bloccata aperta, mentre il processo si interrompe ma continua ad essere associato alla porta precedente.

9/10 volte la correzione può essere:

$ ps aux | grep redis

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

$ kill 2976

$ redis-server

Buono a partire.


3

Nel mio caso era:

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

Per scoprire qual è il nome del tuo servizio, puoi eseguire:

sudo updatedb
locate redis

E ti mostrerà tutti i file Redis nel tuo sistema.


3

se hai fatto install (es. ubuntu) durante l'installazione di redis allora puoi fare:

redis-cli shutdown

come indicato da @ yojimbo87 :)


2

Un altro modo potrebbe essere:

brew services stop redis

+10 per questo, funziona senza scuse su Mac! questo funziona anche ™ brew services start redis ™ ¢ brew services restart redis ¢
Victor.Uduak

2

In seguito ha funzionato per me su MAC

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

2

Se stai eseguendo redis in un contenitore finestra mobile, nessuna delle risposte presenti sarà di aiuto. Devi smettere di redis container. Altrimenti, il processo di redis continuerà a rigenerarsi.

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

$ docker stop e1c008ab04a2
e1c008ab04a2

2

Se sai su quale porta (impostazione predefinita: 6379) è in esecuzione il tuo server redis puoi andare con l' opzione 1 oppure puoi controllare il tuo processo redis e puoi uccidere con l' opzione 2

opzione 1:
uccidere il processo sulla porta:

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

opzione 2:
trova il server Redis precedentemente in esecuzione:

 ps auxx | grep redis-server

Uccidi il processo specifico trovando PID (Process ID) - Redis Sever

kill -9 PID

Ora avvia il tuo server redis con

redis-server /path/to/redis.conf 

1

Non lo so specificamente per Redis, ma per i server in generale:

Quale sistema operativo o distribuzione? Spesso ci sarà un comando stop o /etc/init.d / ... che sarà in grado di cercare il pid esistente in un file pid.

Puoi cercare con quale processo è già associato alla porta sudo netstat -nlpt(opzioni di Linux; altri tipi di netstat varieranno) e segnalarlo per fermarlo. Vorrei non usare kill -9su un server che esegue a meno che non v'è davvero nessun altro segnale o metodo per spegnerlo.


1

I comandi seguenti funzionano per me su Ubuntu Server

$ service /etc/init.d/redis_6379 stop
$ service /etc/init.d/redis_6379 start
$ service /etc/init.d/redis_6379 restart

0

Su MacOSX,

Questo è ciò che ha funzionato per me

/etc/init.d/redis restart

/etc/init.d/redis stop

/etc/init.d/redis start

0

Una cosa da verificare se i comandi redis non funzionano per te è se il tuo redis-server.pid viene effettivamente creato. Si specifica la posizione in cui si trova questo file

/etc/systemd/system/redis.service 

e dovrebbe avere una sezione simile a questa:

[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

Controlla la posizione e le autorizzazioni della directory PIDFile (nel mio caso, '/ run / redis'). Stavo cercando di riavviare il servizio connesso come deploy ma le autorizzazioni della directory erano elencate come

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

Se hai bisogno di un aggiornamento delle autorizzazioni di Linux, dai un'occhiata . Ma il problema era che stavo eseguendo il riavvio come utente di distribuzione, le cui autorizzazioni sopra sono rx, non permettendo al mio utente di scrivere nella directory PIDFile.

Una volta capito, ho effettuato l'accesso usando root, rieseguendo il comando restart su redis ( service redis restart) e tutto ha funzionato. Era un mal di testa, ma spero che questo salvi qualcuno un po 'di tempo.


0

Redis ha un parametro di configurazione pidfile(ad esempio /etc/redis.conf - controlla il codice sorgente di redis ), ad esempio:

# 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

Se è impostato o potrebbe essere impostato, invece di cercare l'id di processo (pid) utilizzando ps + grepqualcosa di simile potrebbe essere utilizzato:

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

Se necessario, è possibile eseguire lo script redis stop in questo modo (adattato script init.d redis 5.0 predefinito nel codice sorgente 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.