如何停止Redis服务器?


334

我显然redis-server正在运行一个实例,因为当我尝试通过输入来启动新服务器时,遇到redis-server了以下问题:

Opening port: bind: Address already in use

我不知道如何停止此服务器并启动新服务器。

redis-server在CLI中键入命令时,可以追加任何命令吗?

我的操作系统是Ubuntu 10.04。


您正在使用哪个操作系统和发行版?
yojimbo87 2011年

女士们,先生们,如果您没有通过软件包管理器安装Redis,而是从源代码安装的,则它可能不适用于systemv或upstart或ubuntu上的systemd。因此,默认情况下所选答案将不起作用。第二个答案(未标记为正确)似乎更可靠。
多纳托

提示:可以通过测试Redis服务器是否正在运行redis-cli ping。正在运行的Redis服务器将以响应PONG
Jochem Schulenklopper

Answers:


554

连接到节点实例并使用shutdown命令,或者如果您在ubuntu上,则可以尝试通过init.d重新启动Redis服务器:

/etc/init.d/redis-server restart

或停止/启动它:

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

在Mac上

redis-cli shutdown

5
只有以这种方式设置redis时,您才能这样做。凯文·麦克蒂格(Kevin McTigue)的答案仅需最少的设置。
btk 2012年

1
在OS X上,你可能不得不使用launchctl要做到这一点,并在其他系统上,systemctl或者service
tadman 2013年

1
在某些计算机上,sudo /etc/init.d/redis stop将起作用
TroodoN-Mike 2014年

4
在现代Ubuntu上,在将其安装后,我只使用service redis-server stop和。service redis-server startapt-get install redis-server
Cloud Artisans 2015年

1
仅当您将redis-server作为服务运行时,此方法才有效。如果它作为独立的可执行文件运行,则需要显式停止该过程。这是我用来停止该进程的步骤:在Linux机器上的pkill redis-server

199

一种更干净,更可靠的方法是进入redis-cli,然后键入 shutdown

在redis-cli中,输入 help @server,您将在列表底部附近看到它:

SHUTDOWN-摘要:将数据集同步保存到磁盘,然后关闭服务器,因为:0.07

而且,如果您在终端中运行redis-server实例,您将看到以下内容:

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可以避免冗余的一件事是,例如,为当前bash会话设置别名alias redis-cli="redis-cli -a mypassword"。这样,您可以像在我的原始评论中那样拨打电话,而不必在每次使用时都重新提供密码。
JesseBuesking

@jessebuesking非常有创意!不会考虑解决方案。由于某种原因,我有点害怕将密码放入配置文件中
glarrain

@glarrain对此一无所知,但我认为这样做只会将其存储在当前会话的内存中(也就是不要将其添加到您的bashrc或bash_profile中,只需在提示符下原样输入即可)。
JesseBuesking

141

redis-cli shutdown最有效。接受的答案对我不起作用(OSX Lion)。谢谢@JesseBuesking。


是的,接受的答案仅适用于以所描述的方式将Redis设置为服务的Linux系统
glarrain

2
这也适用于Windows。redis-cli.exe shutdown
布兰登·布恩

正如我上面提到的,遗憾的是这种(相当明显的)方法很难找到。我希望redis-cli --help本来可以解决这个问题。
Jochem Schulenklopper '18 -4-6

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-services,Homebrew具有可用于启动,停止和重新启动服务的功能。自制服务

brew services 运行时自动安装。

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

如果使用run,则它将不会在登录时启动(也不会启动)。start将启动该redis服务,并在登录和启动时将其添加。


3
如果您使用自制软件安装了redis,brew services stop redis也可以使用!:)
Edouard Berthe

我建议现在使用Brew服务来处理默认值的启动和停止。如果您需要更多控制权,那么还有其他选择。
雷·亨特

1
这是最好的答案,因为它适用于所有linux版本和mac,包括使用apt,yum,brew或下载安装的版本。他们是否具有暴发户,init或system d脚本。谢谢
dont_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上使用。(经过Mac测试,Unix批准)
ThomasReggi 2012年

24
很难杀死数据库服务器的好主意。总是喜欢适当的关机,或者至少杀死-15而不是杀死-9。
Zsolt Szilagyi

2
@ZsoltSzilagy,您应该提供链接或某种解释来解释为什么这是一个坏主意。就像redis延迟写入一样,因此内存中仍会存在未提交的数据。
notbad.jpeg 2014年

5
@ notbad.jpeg,当然,您也可以将计算机放在地板上。如果表足够高,这也应停止服务器。我需要一个链接或某种解释来解释为什么这是一个坏主意吗?
osa 2014年

2
使用这种方法,您无需考虑redis数据库状态。您正在使用操作系统功能来关闭应用程序,而不是使用应用程序本身或守护程序,后者也可能也在使用应用程序功能。此解决方案就像拔下电缆以关闭电视。
耶稣

15

选项1:src在我的情况下,转到redis安装目录并导航至:

/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

以root用户停止终端中的redis服务器类型

sudo service redis-server stop

停止redis服务器后,将显示该消息

Stopping redis-server: redis-server.

如果要启动redis-server类型

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,不,这不应该是IMO接受的答案。让操作系统终止正在运行的进程,可以忽略应用程序可能在内存中保存一些尚未保存到更持久存储中的数据的情况。通过应用程序提供的方法关闭应用程序最好是一个更好的选择。
Jochem Schulenklopper


5

如果您知道它将在哪个端口上运行(默认情况下为6379),则可以使用以下命令使用该端口获取进程的pid,然后可以对相同的pid执行kill命令。

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

如果您在安装Redis时确实进行了安装(例如ubuntu),则可以执行以下操作:

redis-cli shutdown

@ yojimbo87所指出的:)




2

如果您正在docker容器中运行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

如果您知道Redis服务器在哪个端口(默认值:6379)上运行,则可以使用选项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(进程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登录,然后在redis(service redis restart)上重新运行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

如果已设置或可以设置,则ps + grep可以使用如下所示的方法代替搜索进程ID(pid):

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

如果需要,可以像这样制作redis停止脚本redis源代码中的自适应默认redis 5.0 init.d脚本):

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.