Как я могу остановить редис-сервер?


335

Очевидно, у меня redis-serverзапущен экземпляр, потому что когда я пытаюсь запустить новый сервер, введя redis-serverкоманду, я приветствую следующее:

Opening port: bind: Address already in use

Я не могу понять, как остановить этот сервер и запустить новый.

Есть ли какая-либо команда, к которой я могу добавить, redis-serverкогда я набираю в CLI?

Моя ОС - Ubuntu 10.04.


Какую ОС и дистрибутив вы используете?
yojimbo87

Дамы и господа, если вы не установили redis через менеджер пакетов и установили его из исходного кода, он может не работать с systemv, upstart или systemd в ubuntu. Таким образом, выбранный ответ не будет работать по умолчанию. Второй ответ, который не помечен как правильный, представляется более надежным.
Донато

Совет: проверка работоспособности сервера Redis может быть выполнена через redis-cli ping. Работающий сервер Redis ответит PONG.
Йохем Шуленклоппер

Ответы:


555

Либо подключитесь к экземпляру узла и используйте команду shutdown, либо, если вы используете Ubuntu, вы можете попытаться перезапустить сервер Redis через init.d:

/etc/init.d/redis-server restart

или остановите / запустите это:

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

На Mac

redis-cli shutdown

5
Вы можете сделать это, только если вы настроите Redis таким образом. Ответ Кевина Мактига работает с минимальной настройкой.
БТК

1
В OS X вам, вероятно, придется использовать launchctlэто, а в других системах systemctlили service.
tadman

1
На некоторых машинах sudo /etc/init.d/redis stop будет работать
TroodoN-Mike

4
На современном Ubuntu я просто использую service redis-server stopи service redis-server start, после установки его с apt-get install redis-server.
Облачные Ремесленники

1
Это работает, только если у вас есть Redis-сервер, работающий в качестве службы. Если он работает как автономный исполняемый файл, вам необходимо явно остановить процесс. Вот шаги, которые я использовал для остановки процесса: pkill redis-server на linux box

199

Более чистый и надежный способ - перейти в Redis-Cli, а затем набрать shutdown

В Redis-Cli, введите, help @serverи вы увидите это в нижней части списка:

SHUTDOWN - сводка: синхронно сохраните набор данных на диск и затем завершите работу сервера, начиная с: 0.07

И если у вас есть экземпляр redis-сервера, работающий в терминале, вы увидите это:

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
Или даже не начинайте Redis-Cli. Просто отправьте его из командной строки через redis-cli shutdown. (например, вы можете отправить любую такую ​​команду redis-cli set cat dog; redis-cli get cat)
JesseBuesking

6
Единственное предостережение для комментария @jessebuesking - это то, что если вы установили защиту паролем, redis-cli set cat dog; redis-cli get catизменения в redis-cli -a mypassword set cat dog; redis-cli -a mypassword get cat, что может раздражать после нескольких команд.
гларрей

@glarrain Единственное, что вы можете сделать, чтобы избежать избыточности, это установить псевдоним для вашей текущей сессии bash, например alias redis-cli="redis-cli -a mypassword". Таким образом, вы можете совершать звонки, как в моем первоначальном комментарии, без необходимости повторного ввода пароля при каждом использовании.
JesseBuesking

@jessebuesking очень креативно! Не думал бы о решении. Почему-то я немного боюсь ставить пароли в конфигурационных файлах
glarrain

@glarrain не поверьте мне на слово, но я думаю, что это сохранит его в памяти только для текущего сеанса (иначе не добавляйте его в ваш bashrc или bash_profile, просто введите его как есть из вашего приглашения).
JesseBuesking

141

redis-cli shutdownявляется наиболее эффективным. Принятый ответ не работает для меня (OSX Lion). Спасибо, @JesseBuesking.


да, принятый ответ работает только для систем Linux с Redis, настроенным как служба изображенным способом
glarrain

2
Это также работает на Windows. redis-cli.exe shutdown
Брэндон Бун

Как я уже упоминал выше, очень жаль, что этот (довольно очевидный) метод так трудно найти. Я ожидал, что redis-cli --helpмог бы охватить этот случай.
Йохем Шуленклоппер

42

Для OSX я создал следующие псевдонимы для запуска и остановки redis(устанавливается вместе с Homebrew):

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

Это отлично работает для местного развития!

Доморощенный теперь имеет, homebrew-servicesчто может быть использовано для запуска, остановки и перезапуска служб. доморощенного-услуги

brew services автоматически устанавливается при запуске.

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

Если вы используете run, то он не запустится при входе в систему (ни при загрузке). startзапустит redisсервис и добавит его при входе и загрузке.


3
Если вы установили Redis с помощью доморощенного, brew services stop redisтакже работает! :)
Эдуард Берт,

Я бы порекомендовал использовать brew services сейчас для обработки запуска и остановки по умолчанию. Если вам нужно немного больше контроля, то есть и другие варианты.
Рэй Хантер

1
Это лучший ответ, так как он работает на всех версиях Linux и Mac, включая те, которые установлены с использованием apt, yum, brew или download. Есть ли у них выскочки или сценарии init или system d или нет. Спасибо
didnt_matter

1
Мне нравится название псевдонимов :) Круто!
Thinklinux

1
что мне делать, если я хочу перезапустить, а не выключать @RayHunter
АЭФИТ РАДЖЕНДРАН

25

Введите SHUTDOWNв CLI

или

если вы не заботитесь о своих данных в памяти, вы можете также ввести SHUTDOWN NOSAVEпринудительное завершение работы сервера.


16

Попробуй killall redis-server. Вы также можете использовать, ps auxчтобы найти имя и pid вашего сервера, а затем убить его с помощью kill -9 here_pid_number.


Это здорово, работает на Mac / Unix. (Mac протестирован, одобрен Unix)
ThomasReggi

24
Плохая идея жестко убить сервер БД. Всегда предпочитайте правильное выключение или, по крайней мере, убивайте -15 вместо -9.
Жолт Силаги

2
@ZsoltSzilagy Вы должны предоставить ссылку или объяснение, почему это плохая идея. Например, как Redis выполняет отложенную запись, так что в памяти по-прежнему будут незафиксированные данные.
notbad.jpeg

5
@ notbad.jpeg, конечно, вы также можете уронить компьютер на пол. Если таблица достаточно высокая, это также должно остановить сервер. Нужна ли мне ссылка или какое-то объяснение, почему это плохая идея?
Оса

2
С этим методом вы не думаете о состоянии базы данных Redis. Вы используете функциональность ОС для выключения приложения вместо того, чтобы использовать само приложение или демон, который, вероятно, тоже использует функциональность приложения. Это решение похоже на отключение кабеля для выключения телевизора.
Иисус

15

Вариант 1: перейдите в каталог установки Redis и перейдите src, в моем случае:

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

где 6379 - порт по умолчанию.

Вариант 2: найти процесс redis и убить

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

И тогда начните убивать:

kill -9 22292

kill -9 22299

Я использую Centos 6.7, x86_64

Надеюсь, поможет


12

остановите тип сервера redis в терминале с пользователем root

sudo service redis-server stop

сообщение будет отображаться после остановки редис-сервера

Stopping redis-server: redis-server.

если вы хотите запустить тип сервера redis

sudo service redis-server start

если вы хотите перезагрузить тип сервера

sudo service redis-server restart

Интересно, это все еще действует для новых версий Redis, если настроено по умолчанию. Выдача service --status-allне будет показывать redis, следовательно, любая serviceкоманда не будет выполнена redis-server. Но Redis действительно показывает в ps -ef. Я просто не могу найти связанный документ.
themefield

Похоже на Ubuntu 18.04 sudo service redis start/stop/statusделает то же самое, оба идут.
frmbelz

10

Другой способ может быть:

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

Работает на * NIX & OSX


1
@JoenasE, нет, это не должно быть принятым ответом ИМО. То, что ОС уничтожает работающий процесс, игнорирует случай, когда приложение может иметь в памяти некоторые данные, которые еще не сохранены в более постоянном хранилище. Выключение приложения с помощью метода, предоставленного приложением , предпочтительно является лучшим вариантом.
Йохем Шуленклоппер

6

MacOSX - это сработало :)

Шаг 1: Найдите ранее работающий Redis Server

ps auxx | grep redis-server

Шаг 2. Завершите определенный процесс, найдя PID (идентификатор процесса) - Redis Sever

kill -9 PID

5

Если вы знаете, на каком порту он будет работать (по умолчанию это будет 6379), вы можете использовать приведенную ниже команду, чтобы получить pid процесса, использующего этот порт, а затем выполнить команду kill для того же pid.

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

Приведенная выше команда даст вам pid.

убийство <pid> ;

Это отключит ваш сервер.


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

Обычно эта проблема возникает после того, как я нерегулярно выключаю свой компьютер (или оставляю работающим). Я считаю, что порт застревает открытым, в то время как процесс останавливается, но продолжает привязываться к предыдущему порту.

9/10 раз исправить можно:

$ ps aux | grep redis

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

$ kill 2976

$ redis-server

Хорошо пойти.


3

В моем случае это было:

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

Чтобы узнать, как называется ваша служба, вы можете запустить:

sudo updatedb
locate redis

И он покажет вам все файлы Redis в вашей системе.


3

если вы сделали make install (например, Ubuntu) во время установки Redis, то вы можете сделать:

redis-cli shutdown

как указано на @ yojimbo87 :)


2

Другой способ может быть:

brew services stop redis

+10 за это, работает без извинений на Mac! это также работает ™ brew services start redis ™ ¢ brew services restart redis ¢
Victor.Uduak


2

Если вы запускаете Redis в Docker-контейнере, ни один из настоящих ответов не поможет. Вы должны остановить контейнер Redis. В противном случае процесс повторного запуска будет возобновляться.

$ 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

Если вы знаете, на каком порту (по умолчанию: 6379) работает ваш сервер Redis, вы можете перейти с параметром 1 или проверить процесс Redis, и вы можете убить с помощью параметра 2.

вариант 1:
убить процесс на порту:

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

Вариант 2:
Найти ранее запущенный Redis Server:

 ps auxx | grep redis-server

Убить конкретный процесс, найдя PID (ID процесса) - Redis Sever

kill -9 PID

Теперь запустите ваш сервер Redis с

redis-server /path/to/redis.conf 

1

Я не знаю конкретно для Redis, но для серверов в целом:

Какая ОС или дистрибутив? Часто будет команда stop или /etc/init.d / ..., которая сможет найти существующий pid в файле pid.

Вы можете посмотреть, какой процесс уже связан с портом sudo netstat -nlpt(параметры linux; другие варианты netstat могут отличаться) и подать сигнал на остановку. Я бы не использовал kill -9на работающем сервере, если на самом деле нет другого сигнала или метода для его выключения.


1

Команды ниже работают для меня на Ubuntu Server

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

0

В MacOSX

Это то, что сработало для меня

/etc/init.d/redis restart

/etc/init.d/redis stop

/etc/init.d/redis start

0

Одна вещь, чтобы проверить, не работают ли команды redis для вас, состоит в том, действительно ли создается ваш redis-server.pid. Вы указываете место, где находится этот файл

/etc/systemd/system/redis.service 

и он должен иметь раздел, который выглядит примерно так:

[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

Проверьте расположение и права доступа к каталогу PIDFile (в моем случае, «/ run / redis»). Я пытался перезапустить службу, вошедшую в систему как развертывание, но разрешения для каталога были указаны как

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

Если вам нужно освежить в Linux разрешения, проверьте это . Но проблема заключалась в том, что я выполнял перезапуск как мой пользователь развертывания, права доступа которого выше, rx, не позволяя моему пользователю писать в каталог PIDFile.

Как только я понял это, я вошел в систему, используя root, повторно выполнил команду restart на redis ( service redis restart), и все заработало . Это была головная боль, но, надеюсь, это сэкономит кому-то немного времени.


0

Redis имеет параметр конфигурации pidfile(например, /etc/redis.conf - проверьте исходный код redis ), например:

# 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

Если он установлен или может быть установлен, вместо поиска идентификатора процесса (pid) можно использовать ps + grepчто-то вроде этого:

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

При необходимости можно сделать скрипт остановки redis следующим образом (адаптированный скрипт redis 5.0 init.d по умолчанию в исходном коде 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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.