Làm thế nào tôi có thể dừng máy chủ redis?


333

Tôi dường như có một redis-servercá thể đang chạy bởi vì khi tôi cố gắng khởi động một máy chủ mới bằng cách vào redis-server, tôi được chào đón như sau:

Opening port: bind: Address already in use

Tôi không thể tìm ra cách dừng máy chủ này và bắt đầu một máy chủ mới.

Có lệnh nào tôi có thể nối thêm redis-serverkhi tôi nhập CLI không?

Hệ điều hành của tôi là Ubuntu 10.04.


Bạn đang sử dụng hệ điều hành và phân phối nào?
yojimbo87

Thưa quý vị, nếu bạn không cài đặt redis thông qua trình quản lý gói và bạn đã cài đặt nó từ nguồn, thì nó có thể không hoạt động với systemv hoặc upstart hoặc systemd trên ubfox. Do đó, câu trả lời được chọn sẽ không hoạt động theo mặc định. Câu trả lời thứ hai, không được đánh dấu chính xác, có vẻ đáng tin cậy hơn.
Donato

Mẹo: kiểm tra xem máy chủ Redis có đang chạy hay không redis-cli ping. Một máy chủ Redis đang chạy sẽ đáp ứng với PONG.
Joool Schulenklopper

Câu trả lời:


552

Kết nối với thể hiện của nút và sử dụng lệnh shutdown hoặc nếu bạn đang ở trên Ubuntu, bạn có thể thử khởi động lại máy chủ redis thông qua init.d:

/etc/init.d/redis-server restart

hoặc dừng / bắt đầu nó:

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

Trên máy Mac

redis-cli shutdown

5
Bạn chỉ có thể làm điều đó nếu bạn thiết lập lại theo cách đó. Câu trả lời của Kevin McTigue hoạt động với thiết lập tối thiểu.
btk

1
Trên OS X, bạn có thể phải sử dụng launchctlđể làm điều này và trên các hệ thống khác systemctlhoặc service.
tadman

1
Trên một số máy, sudo /etc/init.d/redis stop sẽ hoạt động
TroodoN-Mike

4
Trên Ubuntu hiện đại, tôi chỉ sử dụng service redis-server stopservice redis-server startsau khi cài đặt xong apt-get install redis-server.
Nghệ nhân đám mây

1
Điều này chỉ hoạt động nếu bạn có máy chủ redis chạy như một dịch vụ. Nếu nó đang chạy như một thực thi độc lập, thì bạn sẽ cần phải dừng quá trình rõ ràng. Dưới đây là các bước tôi đã sử dụng để dừng quá trình: pkill redis-server trên hộp linux

199

Một cách sạch hơn, đáng tin cậy hơn là vào redis-cli và sau đó gõ shutdown

Trong redis-cli, gõ help @servervà bạn sẽ thấy điều này ở gần cuối danh sách:

SHUTDOWN - tóm tắt: Lưu đồng bộ dữ liệu vào đĩa và sau đó tắt máy chủ kể từ: 0,07

Và nếu bạn có một cá thể máy chủ redis đang chạy trong một thiết bị đầu cuối, bạn sẽ thấy điều này:

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
Hoặc thậm chí không bắt đầu redis-cli. Chỉ cần gửi nó từ dòng lệnh thông qua redis-cli shutdown. (bạn có thể gửi bất kỳ lệnh nào như thế này chẳng hạn redis-cli set cat dog; redis-cli get cat)
JesseBuesking

6
Lời cảnh báo duy nhất cho @jessebuesking là nếu bạn đã thiết lập bảo vệ mật khẩu, các redis-cli set cat dog; redis-cli get catthay đổi thành redis-cli -a mypassword set cat dog; redis-cli -a mypassword get catcó thể gây khó chịu sau một vài lệnh.
glarrain

@glarrain một điều bạn có thể làm để tránh sự dư thừa được đặt bí danh cho phiên bash hiện tại của bạn, ví dụ alias redis-cli="redis-cli -a mypassword". Bằng cách này, bạn có thể thực hiện các cuộc gọi như trong nhận xét ban đầu của tôi mà không phải cung cấp lại mật khẩu cho mỗi lần sử dụng.
JesseBuesking

@jessebuesking rất sáng tạo! Sẽ không nghĩ về giải pháp. Vì một số lý do, tôi hơi ngại đặt mật khẩu vào các tệp cấu hình
glarrain

@glarrain không hiểu ý tôi, nhưng tôi nghĩ rằng việc này sẽ chỉ lưu trữ nó trong bộ nhớ cho phiên hiện tại (hay không thêm nó vào bashrc hoặc bash_profile của bạn, chỉ cần nhập nó như là từ lời nhắc của bạn).
JesseBuesking

141

redis-cli shutdownlà hiệu quả nhất. Câu trả lời được chấp nhận không hoạt động đối với tôi (OSX Lion). Cảm ơn, @JlieBuesking.


vâng, câu trả lời được chấp nhận chỉ hoạt động cho các hệ thống Linux với Redis được thiết lập như một dịch vụ theo cách được mô tả
glarrain

2
Điều này cũng hoạt động trên Windows. redis-cli.exe shutdown
Brandon Boone

Như tôi đã đề cập ở trên, thật đáng tiếc rằng phương pháp (khá rõ ràng) này rất khó tìm. Tôi dự kiến redis-cli --helpcó thể bao gồm trường hợp này.
Joool Schulenklopper

41

Đối với OSX, tôi đã tạo các bí danh sau để bắt đầu và dừng redis(được cài đặt với Homebrew):

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

Điều này đã làm việc rất tốt cho sự phát triển của địa phương!

Homebrew hiện có homebrew-servicesthể được sử dụng để bắt đầu, dừng và khởi động lại dịch vụ. dịch vụ homebrew

brew services được tự động cài đặt khi chạy.

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

Nếu bạn sử dụng run, thì nó sẽ không khởi động khi đăng nhập (cũng không khởi động). startsẽ bắt đầu redisdịch vụ và thêm nó khi đăng nhập và khởi động.


3
Nếu bạn đã cài đặt redis bằng homebrew, brew services stop rediscũng hoạt động! :)
Edouard Berthe

Tôi sẽ khuyên bạn nên sử dụng các dịch vụ sản xuất bia ngay bây giờ để xử lý việc bắt đầu và dừng cho các mặc định. Nếu bạn cần kiểm soát nhiều hơn một chút thì cũng có những lựa chọn khác.
Ray Hunter

1
Đây là câu trả lời tốt nhất vì nó hoạt động trên tất cả các hương vị linux và mac, bao gồm cả những thứ được cài đặt bằng apt, yum, brew hoặc download. Họ có tập lệnh khởi động hoặc init hoặc hệ thống d hay không. Cảm ơn
doesnt_matter

1
Tôi thích tên của các bí danh :) Tuyệt!
thinklinux 17/10/18

1
Tôi nên làm gì nếu tôi muốn khởi động lại và không tắt máy @RayHunter
AATHITH RAJENDRAN

25

Nhập SHUTDOWNvào CLI

hoặc là

nếu bạn không quan tâm đến dữ liệu của mình trong bộ nhớ, bạn cũng có thể gõ SHUTDOWN NOSAVEđể buộc tắt máy chủ.


16

Hãy thử killall redis-server. Bạn cũng có thể sử dụng ps auxđể tìm tên và pid của máy chủ của mình, và sau đó giết nó bằng kill -9 here_pid_number.


Điều này thật tuyệt, hoạt động trên mac / unix. (Mac đã thử nghiệm, chưa được phê duyệt)
ThomasReggi

24
Ý tưởng tồi để giết chết một máy chủ DB. Luôn thích tắt máy đúng cách, hoặc ít nhất, giết -15 thay vì giết -9.
Zsolt Szilagyi

2
@ZsoltSzilagy bạn nên cung cấp một liên kết hoặc phần nào giải thích lý do tại sao đó là một ý tưởng tồi. Giống như cách redis không trì hoãn ghi, do đó vẫn sẽ có dữ liệu không được cam kết trong bộ nhớ.
notbad.jpeg

5
@ notbad.jpeg, tất nhiên, bạn cũng có thể thả máy tính xuống sàn. Nếu bảng đủ cao, điều này cũng sẽ dừng máy chủ. Tôi có cần một liên kết hoặc phần nào giải thích về lý do tại sao đây là một ý tưởng tồi?
osa

2
Với phương pháp này, bạn không nghĩ về trạng thái cơ sở dữ liệu redis. Bạn đang sử dụng chức năng HĐH để tắt ứng dụng thay vì sử dụng chính ứng dụng hoặc daemon, có lẽ cũng đang sử dụng chức năng của ứng dụng. Giải pháp này giống như rút cáp để tắt TV.
Chúa Giêsu

15

Tùy chọn 1: đi đến thư mục cài đặt lại và điều hướng đến src, trong trường hợp của tôi:

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

trong đó 6379 là cổng mặc định.

Tùy chọn 2: tìm quá trình redis và giết

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

Và sau đó bắt đầu giết:

kill -9 22292

kill -9 22299

Tôi đang sử dụng Centos 6.7, x86_64

hy vọng nó giúp


12

dừng loại máy chủ redis trong terminal với người dùng root

sudo service redis-server stop

thông báo sẽ được hiển thị sau khi dừng máy chủ redis

Stopping redis-server: redis-server.

nếu bạn muốn bắt đầu loại máy chủ redis

sudo service redis-server start

nếu bạn muốn khởi động lại loại máy chủ

sudo service redis-server restart

Tôi tự hỏi nếu điều này vẫn còn hiệu lực cho các phiên bản Redis mới nếu được cấu hình theo mặc định. Việc ban hành service --status-allsẽ không hiển thị redis, do đó bất kỳ servicelệnh nào sẽ thất bại redis-server. Nhưng redis không hiển thị trong ps -ef. Tôi chỉ không thể tìm thấy bất kỳ tài liệu liên quan.
lượng vào

Trông trên Ubuntu 18.04 sudo service redis start/stop/statuscũng vậy, cả hai đều đi.
frmbelz

10

Một cách khác có thể là:

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

Hoạt động trên * NIX & OSX


1
@JoenasE, không, đây không phải là câu trả lời được chấp nhận IMO. Việc hệ điều hành giết một tiến trình đang chạy sẽ bỏ qua trường hợp ứng dụng có thể có một số dữ liệu trong bộ nhớ chưa được lưu vào một cửa hàng liên tục hơn. Tắt ứng dụng thông qua một phương thức được cung cấp bởi ứng dụng tốt nhất là một lựa chọn tốt hơn.
Joool Schulenklopper

6

MacOSX - Nó hoạt động :)

Bước 1: Tìm máy chủ Redis đang chạy trước đó

ps auxx | grep redis-server

Bước 2: Tiêu diệt quy trình cụ thể bằng cách tìm PID (ID quy trình) - Redis Sever

kill -9 PID

5

Nếu bạn biết nó sẽ chạy trên cổng nào (theo mặc định nó sẽ là 6379), bạn có thể sử dụng lệnh bên dưới để lấy pid của quá trình sử dụng cổng đó và sau đó có thể thực thi lệnh kill cho cùng một pid.

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

lệnh trên sẽ cung cấp cho bạn pid.

giết <pid>;

Điều này sẽ tắt máy chủ của bạn.


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

Thông thường, sự cố này phát sinh sau khi tôi tắt máy tính (hoặc đang chạy) một cách bất thường .. Tôi tin rằng cổng bị kẹt mở, trong khi quá trình dừng lại nhưng tiếp tục bị ràng buộc với cổng trước đó.

9/10 lần sửa chữa có thể là:

$ ps aux | grep redis

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

$ kill 2976

$ redis-server

Tốt để đi.


3

Trong trường hợp của tôi, đó là:

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

Để tìm hiểu tên dịch vụ của bạn là gì, bạn có thể chạy:

sudo updatedb
locate redis

Và nó sẽ hiển thị cho bạn mọi tệp Redis trong hệ thống của bạn.


3

Nếu bạn đã thực hiện cài đặt (ví dụ: Ubuntu) trong khi cài đặt redis thì bạn có thể làm:

redis-cli shutdown

như được chỉ ra bởi @ yojimbo87 :)


2

Một cách khác có thể là:

brew services stop redis

+10 cho điều này, nó hoạt động mà không cần xin lỗi trên mac! điều này cũng hoạt động ™ dịch vụ sản xuất bia bắt đầu redis ™ dịch vụ sản xuất bia khởi động lại redis Victor
Victor.Uduak

2

Sau đây làm việc cho tôi trên MAC

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

2

Nếu bạn đang chạy redis trong một container docker, không có câu trả lời hiện tại nào có ích. Bạn phải dừng redis container. Nếu không, quá trình redis sẽ tiếp tục hồi sinh.

$ 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

Nếu bạn biết cổng nào (mặc định: 6379) máy chủ redis của bạn đang chạy, bạn có thể đi với tùy chọn 1 hoặc bạn có thể kiểm tra quy trình redis của mình và bạn có thể giết bằng tùy chọn 2

tùy chọn 1:
Kill process trên cổng:

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

tùy chọn 2:
Tìm máy chủ Redis đang chạy trước đó:

 ps auxx | grep redis-server

Giết quá trình cụ thể bằng cách tìm PID (ID tiến trình) - Redis Sever

kill -9 PID

Bây giờ bắt đầu máy chủ redis của bạn với

redis-server /path/to/redis.conf 

1

Tôi không biết cụ thể cho redis, nhưng nói chung cho các máy chủ:

Hệ điều hành hay phân phối gì? Thường thì sẽ có lệnh dừng hoặc /etc/init.d / ... sẽ có thể tra cứu pid hiện có trong tệp pid.

Bạn có thể tra cứu tiến trình nào đã được ràng buộc với cổng với sudo netstat -nlpt(tùy chọn linux; các hương vị netstat khác sẽ thay đổi) và báo hiệu nó dừng lại. Tôi sẽ không sử dụng kill -9trên một máy chủ đang chạy trừ khi thực sự không có tín hiệu hay phương pháp nào khác để tắt nó.


1

Các lệnh dưới đây hoạt động với tôi trên Ubuntu Server

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

0

Trên MacOSX,

Đây là những gì làm việc cho tôi

/etc/init.d/redis restart

/etc/init.d/redis stop

/etc/init.d/redis start

0

Một điều cần kiểm tra nếu các lệnh redis không hoạt động với bạn là nếu redis-server.pid của bạn thực sự được tạo. Bạn chỉ định vị trí của tập tin này

/etc/systemd/system/redis.service 

và nó nên có một phần trông như thế này:

[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

Kiểm tra vị trí và quyền của thư mục PIDFile (trong trường hợp của tôi, '/ run / redis'). Tôi đã cố gắng khởi động lại dịch vụ đăng nhập như triển khai nhưng các quyền của thư mục được liệt kê là

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

Nếu bạn cần làm mới lại các quyền của linux, hãy kiểm tra điều này . Nhưng vấn đề là tôi đã thực hiện khởi động lại với tư cách là người dùng triển khai của tôi mà các quyền ở trên là rx, không cho phép người dùng của tôi ghi vào thư mục PIDFile.

Khi tôi nhận ra điều đó, tôi đã đăng nhập bằng root, chạy lại lệnh khởi động lại trên redis ( service redis restart) và mọi thứ đều hoạt động. Đó là một vấn đề đau đầu nhưng hy vọng điều này sẽ tiết kiệm cho ai đó một chút thời gian.


0

Redis có tham số cấu hình pidfile (ví dụ /etc/redis.conf - kiểm tra mã nguồn redis ), ví dụ:

# 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

Nếu nó được đặt hoặc có thể được đặt, thay vì tìm kiếm process id (pid) bằng cách sử dụng ps + grepcái gì đó như thế này có thể được sử dụng:

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

Nếu được yêu cầu, người ta có thể tạo tập lệnh dừng lại như thế này ( tập lệnh redis 5.0 init.d mặc định trong mã nguồn 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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.