Jak mogę zatrzymać serwer redis?


334

Najwyraźniej mam redis-serveruruchomioną instancję, ponieważ kiedy próbuję uruchomić nowy serwer, wchodząc redis-server, pojawia się następujący komunikat:

Opening port: bind: Address already in use

Nie mogę wymyślić, jak zatrzymać ten serwer i uruchomić nowy.

Czy jest jakieś polecenie, do którego mogę dołączyć, redis-servergdy piszę w interfejsie CLI?

Mój system operacyjny to Ubuntu 10.04.


Z jakiego systemu operacyjnego i dystrybucji korzystasz?
yojimbo87

Panie i panowie! Jeśli nie zainstalowałeś redis za pomocą menedżera pakietów, a zainstalowałeś go ze źródła, to może nie działać z systememv lub upstart lub systemd na Ubuntu. Dlatego wybrana odpowiedź nie będzie domyślnie działać. Druga odpowiedź, która nie jest oznaczona jako poprawna, wydaje się bardziej wiarygodna.
Donato,

Wskazówka: testowanie, czy serwer Redis działa, można wykonać za pośrednictwem redis-cli ping. Działający serwer Redis odpowie za pomocą PONG.
Jochem Schulenklopper,

Odpowiedzi:


554

Połącz się z instancją węzła i użyj polecenia shutdown lub jeśli jesteś na Ubuntu, możesz spróbować zrestartować serwer Redis poprzez init.d:

/etc/init.d/redis-server restart

lub zatrzymaj / uruchom:

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

Na Macu

redis-cli shutdown

5
Możesz to zrobić tylko wtedy, gdy skonfigurujesz redis w ten sposób. Odpowiedź Kevina McTigue'a działa przy minimalnej konfiguracji.
btk

1
W OS X prawdopodobnie będziesz musiał to launchctlzrobić, aw innych systemach systemctllub service.
tadman

1
Na niektórych komputerach sudo /etc/init.d/redis stop będzie działać
TroodoN-Mike

4
Na współczesnym Ubuntu po prostu używam service redis-server stopi service redis-server startpo zainstalowaniu go apt-get install redis-server.
Cloud Artisans

1
Działa to tylko wtedy, gdy serwer redis działa jako usługa. Jeśli działa jako samodzielny plik wykonywalny, musisz jawnie zatrzymać proces. Oto kroki, których użyłem, aby zatrzymać proces: pkill redis-server na Linux

199

Czystszym, bardziej niezawodnym sposobem jest przejście do redis-cli, a następnie pisanie shutdown

W redis-cli wpisz, help @servera zobaczysz to u dołu listy:

WYŁĄCZENIE - podsumowanie: Synchronicznie zapisz zestaw danych na dysku, a następnie zamknij serwer od: 0,07

A jeśli masz instancję serwera redis uruchomioną w terminalu, zobaczysz to:

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
Lub nawet nie zaczynaj redis-cli. Wystarczy wysłać go z wiersza polecenia za pośrednictwem redis-cli shutdown. (możesz na przykład wysłać dowolną taką komendę redis-cli set cat dog; redis-cli get cat)
JesseBuesking 30.04.2013

6
Jedynym zastrzeżeniem dla komentarza @jessebuesking jest to, że jeśli skonfigurowałeś ochronę hasłem, zmienisz redis-cli set cat dog; redis-cli get catna redis-cli -a mypassword set cat dog; redis-cli -a mypassword get cat, co może być denerwujące po kilku poleceniach.
glarrain

@glarrain Jedną z rzeczy, które można zrobić, aby uniknąć nadmiarowości, jest na przykład ustawienie aliasu dla bieżącej sesji bash alias redis-cli="redis-cli -a mypassword". W ten sposób możesz wykonywać połączenia jak w moim oryginalnym komentarzu bez konieczności ponownego podawania hasła przy każdym użyciu.
JesseBuesking

@jessebuesking bardzo kreatywny! Nie pomyślałbym o rozwiązaniu. Z jakiegoś powodu trochę boję się umieszczać hasła w plikach konfiguracyjnych
glarrain

@glarrain nie wierz mi na słowo, ale myślę, że zrobienie tego spowoduje zapisanie go tylko w pamięci dla bieżącej sesji (aka nie dodawaj go do swojego bashrc lub bash_profile, po prostu wpisz go od razu po znaku zachęty).
JesseBuesking

141

redis-cli shutdownjest najbardziej skuteczny. Akceptowana odpowiedź nie działa dla mnie (OSX Lion). Dzięki, @JesseBuesking.


tak, zaakceptowana odpowiedź działa tylko w systemach Linux z Redis skonfigurowanym jako usługa w przedstawiony sposób
glarrain

2
Działa to również w systemie Windows. redis-cli.exe shutdown
Brandon Boone

Jak wspomniałem powyżej, szkoda, że ​​ta (raczej oczywista) metoda jest tak trudna do znalezienia. Spodziewałem się, że redis-cli --helpmogło to obejmować tę sprawę.
Jochem Schulenklopper,

41

Dla OSX utworzyłem następujące aliasy do uruchamiania i zatrzymywania redis(instalowane z Homebrew):

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

Działa to świetnie na rozwój lokalny!

Teraz Homebrew ma homebrew-servicesmożliwość uruchamiania, zatrzymywania i restartowania usług. usługi homebrew

brew services jest automatycznie instalowany po uruchomieniu.

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

Jeśli używasz run, to nie uruchomi się przy logowaniu (ani nie uruchomi się). starturuchomi redisusługę i doda ją przy logowaniu i uruchomieniu.


3
Jeśli zainstalowałeś Redis za pomocą Homebrew, brew services stop redisrównież działa! :)
Edouard Berthe,

Polecam teraz korzystanie z usług brew do obsługi uruchamiania i zatrzymywania ustawień domyślnych. Jeśli potrzebujesz trochę więcej kontroli, są też inne opcje.
Ray Hunter,

1
Jest to najlepsza odpowiedź, ponieważ działa na wszystkich smakach linuksowych i macach, w tym na tych instalowanych przy użyciu apt, yum, brew lub download. Nieważne, czy mają skrypty startowe, init, czy systemowe. Dzięki
doesnt_matter

1
Podoba mi się nazwa aliasu :) Fajnie!
thinklinux

1
co powinienem zrobić, jeśli chcę zrestartować i nie zamknąć @RayHunter
AATHITH RAJENDRAN

25

Wpisz SHUTDOWNCLI

lub

jeśli nie zależy ci na danych w pamięci, możesz także wpisać, SHUTDOWN NOSAVEaby wymusić zamknięcie serwera.


16

Spróbować killall redis-server. Możesz także użyć ps auxdo znalezienia nazwy i pid serwera, a następnie zabić go kill -9 here_pid_number.


To jest świetne, działa na Mac / Unix. (Testowany na Macu, zatwierdzony dla Uniksa)
ThomasReggi,

24
Zły pomysł na zabicie serwera DB. Zawsze preferuj właściwe zamknięcie, a przynajmniej zabij -15 zamiast zabić -9.
Zsolt Szilagyi

2
@ZsoltSzilagy powinieneś podać link lub wyjaśnienie, dlaczego jest to zły pomysł. Podobnie jak w przypadku opóźnionego zapisu przez redis, aby w pamięci nadal znajdowały się nieproszone dane.
notbad.jpeg

5
@ notbad.jpeg można oczywiście upuścić komputer na podłogę. Jeśli tabela jest wystarczająco wysoka, powinno to również zatrzymać serwer. Czy potrzebuję linku lub jakiegoś wyjaśnienia, dlaczego jest to zły pomysł?
osa

2
Dzięki tej metodzie nie myślisz o stanie bazy danych redis. Używasz funkcji systemu operacyjnego do zamykania aplikacji zamiast korzystania z samej aplikacji lub demona, który prawdopodobnie również korzysta z funkcji aplikacji. To rozwiązanie jest jak odłączenie kabla w celu wyłączenia telewizora.
Jezus

15

Opcja 1: przejdź do katalogu instalacyjnego redis i przejdź do src, w moim przypadku:

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

gdzie 6379 jest domyślnym portem.

Opcja 2: znajdź proces redis i zabij

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

A następnie zainicjuj zabijanie:

kill -9 22292

kill -9 22299

Używam Centos 6.7, x86_64

mam nadzieję, że to pomoże


12

zatrzymaj typ serwera redis w terminalu z użytkownikiem root

sudo service redis-server stop

komunikat zostanie wyświetlony po zatrzymaniu serwera redis

Stopping redis-server: redis-server.

jeśli chcesz uruchomić typ serwera redis

sudo service redis-server start

jeśli chcesz zrestartować typ serwera

sudo service redis-server restart

Zastanawiam się, czy jest to nadal ważne dla nowych wersji Redis, jeśli jest skonfigurowane domyślnie. Wydanie service --status-allnie pokaże redis, dlatego każde servicepolecenie zakończy się niepowodzeniem redis-server. Ale Redis się pojawia ps -ef. Po prostu nie mogę znaleźć żadnego powiązanego dokumentu.
themefield,

Wygląd na Ubuntu 18.04 sudo service redis start/stop/statusrobi to samo, oba idą.
frmbelz

10

Innym sposobem może być:

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

Działa na * NIX i OSX


1
@JenasE, nie, to nie powinna być zaakceptowana odpowiedź IMO. Zabicie działającego procesu przez system operacyjny pomija przypadek, że aplikacja może mieć pewne dane w pamięci, które nie zostały jeszcze zapisane w bardziej trwałym magazynie. Lepszym rozwiązaniem jest zamknięcie aplikacji za pomocą metody dostarczonej przez aplikację .
Jochem Schulenklopper,

6

MacOSX - działało :)

Krok 1: Znajdź poprzednio działający serwer Redis

ps auxx | grep redis-server

Krok 2: Zabij konkretny proces, znajdując PID (identyfikator procesu) - Redis Sever

kill -9 PID

5

Jeśli wiesz, na jakim porcie byłby uruchomiony (domyślnie będzie to 6379), możesz użyć polecenia poniżej, aby uzyskać numer pid procesu za pomocą tego portu, a następnie wykonać polecenie zabicia dla tego samego pid.

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

powyższe polecenie da ci pid.

zabić <pid>;

Spowoduje to zamknięcie serwera.


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

Zwykle ten problem pojawia się po nieregularnym wyłączeniu komputera (lub pozostawieniu uruchomionego). Uważam, że port utknął, podczas gdy proces zatrzymuje się, ale nadal jest powiązany z poprzednim portem.

9/10 razy poprawka może być:

$ ps aux | grep redis

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

$ kill 2976

$ redis-server

Dobrze iść.


3

W moim przypadku było to:

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

Aby dowiedzieć się, jaka jest nazwa Twojej usługi, możesz uruchomić:

sudo updatedb
locate redis

I pokaże Ci wszystkie pliki Redis w twoim systemie.


3

jeśli wykonałeś instalację (np. ubuntu) podczas instalacji redis , możesz:

redis-cli shutdown

jak wskazał @ yojimbo87 :)


2

Innym sposobem może być:

brew services stop redis

+10 za to działa bez przeprosin na Macu! to również działa ™ usługi parzenia uruchom redis ™ ¢ usługi parzenia uruchom ponownie redis ¢
Victor.Uduak

2

Poniższe działało dla mnie na MAC

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

2

Jeśli korzystasz z opcji redis w kontenerze dokowanym, żadna z obecnych odpowiedzi nie pomoże. Musisz zatrzymać pojemnik redis. W przeciwnym razie proces redis będzie się odradzał.

$ 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

Jeśli wiesz, na którym porcie (domyślnie: 6379) działa twój serwer redis, możesz przejść z opcją 1 lub możesz sprawdzić proces redis i możesz zabić z opcją 2

opcja 1:
Zabij proces na porcie:

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

opcja 2:
Znajdź poprzednio działający serwer Redis:

 ps auxx | grep redis-server

Zabij konkretny proces, znajdując PID (identyfikator procesu) - Redis Sever

kill -9 PID

Teraz uruchom serwer Redis za pomocą

redis-server /path/to/redis.conf 

1

Nie wiem specjalnie dla redis, ale ogólnie dla serwerów:

Jaki system operacyjny lub dystrybucja? Często pojawia się polecenie stop lub /etc/init.d / ..., które będzie w stanie wyszukać istniejący pid w pliku pid.

Możesz sprawdzić, z jakim procesem jest już powiązany port sudo netstat -nlpt(opcje linuksowe; inne smaki netstat będą się różnić) i zasygnalizować, że się zatrzyma. I byłoby nie skorzystać kill -9na uruchomionym serwerem, chyba że naprawdę nie ma innego sposobu, aby sygnał lub go zamknąć.


1

Poniższe polecenia działają dla mnie na Ubuntu Server

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

0

W systemie MacOSX

To działało dla mnie

/etc/init.d/redis restart

/etc/init.d/redis stop

/etc/init.d/redis start

0

Jedną z rzeczy, które należy sprawdzić, czy polecenia redis nie działają, jest to, czy tworzony jest plik redis-server.pid. Określ lokalizację, w której znajduje się ten plik

/etc/systemd/system/redis.service 

i powinien mieć sekcję wyglądającą mniej więcej tak:

[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

Sprawdź lokalizację i uprawnienia do katalogu PIDFile (w moim przypadku „/ run / redis”). Próbowałem zrestartować usługę zalogowaną podczas wdrażania, ale uprawnienia do katalogu były wymienione jako

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

Jeśli potrzebujesz odświeżenia uprawnień do systemu Linux, sprawdź to . Problem polegał na tym, że uruchamiałem restart, ponieważ mój użytkownik wdrażający, którego powyższe uprawnienia to rx, nie pozwala mojemu użytkownikowi na zapis w katalogu PIDFile.

Kiedy zdałem sobie z tego sprawę, zalogowałem się przy użyciu roota, ponownie wykonałem polecenie restartu na redis ( service redis restart) i wszystko działało. To był ból głowy, ale mam nadzieję, że zaoszczędzi to komuś trochę czasu.


0

Redis ma parametr konfiguracyjny pidfile(np. /Etc/redis.conf - sprawdź kod źródłowy redis ), na przykład:

# 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

Jeśli jest ustawiony lub można go ustawić, zamiast szukać identyfikatora procesu (pid) przy użyciu ps + grepczegoś takiego:

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

W razie potrzeby można wykonać skrypt zatrzymania redis w ten sposób (dostosowany domyślny skrypt initis redis 5.0 w kodzie źródłowym 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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.