Як я можу зупинити redis-сервер?


334

У мене, мабуть, працює 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.
Йохем Шуленклоппер

Відповіді:


554

Або підключіться до екземпляра вузла та використовуйте команду відключення, або якщо ви перебуваєте на 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
Зробити це можна лише в тому випадку, якщо ви налаштували редис саме так Відповідь Кевіна Мактігу працює з мінімальними налаштуваннями.
btk

1
На OS X вам, ймовірно, доведеться це використовувати launchctl, а в інших системах, systemctlабо service.
тадман

1
На деяких машинах спрацює зупинка sudo /etc/init.d/redis
TroodoN-Майк

4
На сучасному Ubuntu я просто використовую service redis-server stopі service redis-server start, встановивши його apt-get install redis-server.
Хмарні ремісники

1
Це працює лише в тому випадку, якщо у вас працює сервіс redis-сервер. Якщо він працює як окремий виконуваний файл, тоді вам потрібно буде явно зупинити процес. Ось кроки, якими я зупинив процес: pkill redis-сервер на вікні linux

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

@glarrain Одне, що ви можете зробити, щоб уникнути надмірності, це, наприклад, псевдонім для вашої поточної сесії 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міг би охопити цю справу.
Йохем Шуленклоппер

41

Для 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 є 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також працює! :)
Едуард Берте

Я б рекомендував зараз використовувати сервіси пивоваріння для обробки запуску та зупинки за замовчуванням. Якщо вам потрібно трохи більше контролю, то є й інші варіанти.
Рей Хантер

1
Це найкраща відповідь, оскільки вона працює на всі смаки Linux та mac, включаючи встановлені за допомогою apt, yum, варити чи завантажувати. Більше вони мають на початку або сценарії init чи системні d або ні. Дякую
doesnt_matter

1
Мені подобається ім’я псевдонімів :) Класно!
thinklinux

1
що мені робити, якщо я хочу перезапустити, а не відключити @RayHunter
AATHITH RAJENDRAN

25

Введіть SHUTDOWNCLI

або

якщо вас не хвилює ваші дані в пам'яті, ви також можете ввести, SHUTDOWN NOSAVEщоб примусити відключити сервер.


16

Спробуйте killall redis-server. Ви також ps auxможете знайти ім'я та pid свого сервера, а потім вбити його kill -9 here_pid_number.


Це чудово, працює на mac / unix. (
Тестується на

24
Погана ідея важко вбити сервер БД. Завжди віддайте перевагу правильному відключенню або, принаймні, вбийте -15, а не убийте -9.
Zsolt Szilagyi

2
@ZsoltSzilagy ви повинні надати посилання або дещо пояснення, чому це погана ідея. Як і те, як Redis робить відкладені записи, так що в пам’яті все ще залишаться невмілі дані.
notbad.jpeg

5
@ notbad.jpeg, звичайно, ви також можете кинути комп'ютер на підлогу. Якщо таблиця досить висока, це також повинно зупинити сервер. Чи потрібно мені посилання чи дещо пояснення, чому це погана ідея?
оса

2
За допомогою цього методу ви не замислюєтесь про стан бази даних redis. Ви використовуєте функцію ОС для вимкнення програми замість того, щоб використовувати саму програму чи демон, який, ймовірно, також використовує функціональність програми. Це рішення, як відключення кабелю відключення телевізора.
Ісус

15

Варіант 1: перейдіть до каталогу встановлення redis та перейдіть до srcмого випадку:

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

де 6379 - порт за замовчуванням.

Варіант 2: знайти процес перероблення та вбити

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

повідомлення буде відображатися після зупинки сервера redis

Stopping redis-server: redis-server.

якщо ви хочете запустити тип сервера redis

sudo service redis-server start

якщо ви хочете перезапустити тип сервера

sudo service redis-server restart

Цікаво, чи це все-таки справедливо для нових версій Redis, якщо вони налаштовані за замовчуванням. Видача service --status-allне відображатиметься повторно, отже, будь-яка serviceкоманда не вдасться проти redis-server. Але Redis дійсно показує в ps -ef. Я просто не можу знайти жодного пов'язаного документа.
тематичне поле

Схоже, 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

ps auxx | grep redis-server

Крок 2: Убийте конкретний процес, знайшовши PID (ID процесу) - 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

якщо ви зробили встановлення (наприклад, ubuntu) під час встановлення redis, ви можете зробити:

redis-cli shutdown

як вказував @ yojimbo87 :)


2

Іншим способом може бути:

brew services stop redis

+10 для цього, він працює без вибачень на mac! це також працює ™ пивоварні послуги починають redis ™ ¢ пивоварні послуги перезапускають redis ¢
Victor.Uduak


2

Якщо ви запускаєте redis у докер-контейнері, жоден із присутніх відповідей не допоможе. Ви повинні зупинити контейнер Redis. В іншому випадку процес 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:

 ps auxx | grep redis-server

Вбити конкретний процес, знайшовши PID (ідентифікатор процесу) - 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

$ 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, перезапустив команду перезавантаження на 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 stop таким чином (адаптований за замовчуванням сценарій 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.