ฉันจะหยุดเซิร์ฟเวอร์ Redis ได้อย่างไร?


335

เห็นได้ชัดว่าฉันมีredis-serverอินสแตนซ์ที่ทำงานอยู่เนื่องจากเมื่อฉันพยายามเริ่มเซิร์ฟเวอร์ใหม่โดยการป้อนredis-serverฉันได้รับการต้อนรับด้วยสิ่งต่อไปนี้:

Opening port: bind: Address already in use

ฉันไม่สามารถหาวิธีหยุดเซิร์ฟเวอร์นี้และเริ่มใหม่ได้

มีคำสั่งใดที่ฉันสามารถต่อท้ายredis-serverเมื่อฉันพิมพ์ใน CLI หรือไม่

ระบบปฏิบัติการของฉันคือ Ubuntu 10.04


คุณใช้ระบบปฏิบัติการและการกระจายรุ่นใดอยู่
yojimbo87

ท่านสุภาพบุรุษและสุภาพสตรีหากคุณไม่ได้ติดตั้ง redis ผ่านตัวจัดการแพคเกจและคุณติดตั้งจากแหล่งที่มาแล้วมันอาจไม่ทำงานกับ systemv หรือพุ่งพรวดหรือ systemd บน Ubuntu ดังนั้นคำตอบที่เลือกจะไม่ทำงานตามค่าเริ่มต้น คำตอบที่สองซึ่งไม่ได้ทำเครื่องหมายว่าถูกต้องน่าเชื่อถือมากขึ้น
Donato

เคล็ดลับ: การทดสอบว่าเซิร์ฟเวอร์ Redis redis-cli pingทำงานอยู่สามารถทำได้ผ่านทาง บนการใช้เซิร์ฟเวอร์ Redis PONGจะตอบสนองกับ
Jochem Schulenklopper

คำตอบ:


555

เชื่อมต่อกับอินสแตนซ์ของโหนดและใช้คำสั่งปิดระบบหรือถ้าคุณอยู่บน 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 ด้วยวิธีดังกล่าว คำตอบของ Kevin McTigue ใช้งานได้กับการตั้งค่าขั้นต่ำ
btk

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แล้ว
Cloud Artisans

1
ใช้งานได้ก็ต่อเมื่อคุณมีเซิร์ฟเวอร์ Redis ทำงานเป็นบริการ หากมันกำลังทำงานเป็นปฏิบัติการแบบสแตนด์อโลนคุณจะต้องหยุดกระบวนการอย่างชัดเจน นี่คือขั้นตอนที่ฉันใช้เพื่อหยุดกระบวนการ: pkill redis-server บนกล่อง 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 ไม่ใช้คำของฉัน แต่ฉันคิดว่าการทำเช่นนี้จะเก็บไว้ในหน่วยความจำสำหรับเซสชันปัจจุบันเท่านั้น (aka ไม่เพิ่มลงใน bashrc หรือ bash_profile ของคุณเพียงป้อนตามที่เป็นจากพรอมต์ของคุณ)
JesseBuesking

141

redis-cli shutdownมีประสิทธิภาพมากที่สุด คำตอบที่ยอมรับไม่ได้สำหรับฉัน (OSX Lion) ขอบคุณ @JesseBuesking


ใช่คำตอบที่ได้รับการยอมรับใช้ได้เฉพาะกับระบบ Linux ที่ติดตั้ง Redis เป็นบริการในลักษณะที่แสดง
Glarrain

2
สิ่งนี้สามารถใช้งานได้บน Windows redis-cli.exe shutdown
Brandon Boone

ดังที่ฉันได้กล่าวไว้ข้างต้นเป็นเรื่องน่าเสียดายที่วิธีการ (ค่อนข้างชัดเจน) นี้หายากมาก ฉันคาดว่าredis-cli --helpจะได้ครอบคลุมกรณีนี้
Jochem Schulenklopper

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สิ่งที่สามารถใช้ในการเริ่มหยุดและเริ่มบริการใหม่ได้ homebrew บริการ

brew services ติดตั้งโดยอัตโนมัติเมื่อทำงาน

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

หากคุณใช้runมันจะไม่เริ่มต้นที่การเข้าสู่ระบบ (หรือบูต) startจะเริ่มredisบริการและเพิ่มเมื่อเข้าสู่ระบบและบูต


3
หากคุณติดตั้ง redis โดยใช้ homebrew brew services stop redisก็ใช้งานได้! :)
Edouard Berthe

ฉันอยากจะแนะนำให้ใช้บริการชงในขณะนี้สำหรับการจัดการการเริ่มต้นและหยุดสำหรับค่าเริ่มต้น หากคุณต้องการการควบคุมมากกว่านั้นก็มีตัวเลือกอื่น ๆ
เรย์ฮันเตอร์

1
นี่เป็นคำตอบที่ดีที่สุดเพราะใช้งานได้กับทุกรสชาติและลินุกซ์ของ Mac รวมถึงที่ติดตั้งโดยใช้ apt, yum, brew หรือดาวน์โหลด ไม่ว่าพวกเขาจะมี upstart หรือ init หรือ system d script หรือไม่ก็ตาม ขอบคุณ
doesnt_matter

1
ฉันชอบชื่อนามแฝง :) เยี่ยมเลย!
thinklinux

1
ฉันควรทำอย่างไรหากฉันต้องการรีสตาร์ทและไม่ปิดระบบ @RayHunter
AATHITH RAJENDRAN

25

พิมพ์SHUTDOWNใน CLI

หรือ

หากคุณไม่สนใจข้อมูลของคุณในหน่วยความจำคุณอาจพิมพ์SHUTDOWN NOSAVEเพื่อบังคับให้ปิดเซิร์ฟเวอร์


16

ลองkillall redis-serverดู นอกจากนี้คุณยังอาจจะใช้ps auxเพื่อค้นหาชื่อและ pid kill -9 here_pid_numberของเซิร์ฟเวอร์ของคุณแล้วฆ่ามันด้วย


นี่ยอดเยี่ยมใช้งานได้กับ mac / unix (ทดสอบกับ Mac, unix ที่ได้รับอนุมัติ)
ThomasReggi

24
ความคิดที่ดีในการทำลายเซิร์ฟเวอร์ DB ชอบการปิดระบบที่เหมาะสมหรืออย่างน้อยฆ่า -15 แทนที่จะฆ่า -9
Zsolt Szilagyi

2
@ZsoltSzilagy คุณควรให้ลิงก์หรือคำอธิบายเล็กน้อยว่าทำไมมันเป็นความคิดที่ไม่ดี เช่นเดียวกับวิธีที่ redis เขียนล่าช้าดังนั้นจึงยังมีข้อมูลที่ไม่ได้รับการบันทึกในหน่วยความจำ
notbad.jpeg

5
@ notbad.jpeg แน่นอนคุณสามารถวางคอมพิวเตอร์ไว้บนพื้นได้ ถ้าตารางสูงพอก็ควรหยุดเซิร์ฟเวอร์ ฉันจำเป็นต้องมีลิงค์หรือคำอธิบายที่เป็นสาเหตุของความคิดที่ไม่ดีหรือไม่?
osa

2
ด้วยวิธีนี้คุณไม่ได้คิดถึงสถานะฐานข้อมูล redis คุณกำลังใช้ฟังก์ชันการทำงานของระบบปฏิบัติการเพื่อปิดแอปพลิเคชันแทนที่จะใช้แอปพลิเคชันเองหรือภูตซึ่งอาจใช้ฟังก์ชันการทำงานของแอปพลิเคชันด้วย วิธีนี้เป็นเหมือนการถอดสายเคเบิลเพื่อปิดทีวี
พระเยซู

15

ตัวเลือกที่ 1: ไปที่ไดเรกทอรีการติดตั้ง redis อีกครั้งและนำทางไปยังsrcในกรณีของฉัน:

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

โดยที่ 6379 เป็นพอร์ตเริ่มต้น

ตัวเลือกที่ 2: ค้นหากระบวนการ redis และ kill

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 ในเทอร์มินัลด้วยผู้ใช้รูท

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จะไม่แสดง Redis จึงใด ๆคำสั่งจะล้มเหลวกับ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 ไม่นี่ไม่ใช่คำตอบที่ยอมรับได้ของ IMO การให้ระบบปฏิบัติการฆ่ากระบวนการที่กำลังทำงานละเลยกรณีที่แอปพลิเคชันอาจมีข้อมูลบางอย่างในหน่วยความจำที่ยังไม่ได้บันทึกไปยังที่จัดเก็บแบบถาวร การปิดแอปพลิเคชันด้วยวิธีการที่แอปพลิเคชันจัดเตรียมไว้เป็นตัวเลือกที่ดีกว่า
Jochem Schulenklopper

6

MacOSX - ได้ผล :)

ขั้นตอนที่ 1: ค้นหา Redis Server ที่ทำงานก่อนหน้านี้

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! สิ่งนี้ยังใช้งานได้™บริการ Brew เริ่ม redis ™¢บริการ Brew รีสตาร์ท redis
red


2

หากคุณใช้ redis ใน container docker คำตอบปัจจุบันจะไม่ช่วย คุณต้องหยุดการเติมสีแดง มิฉะนั้นกระบวนการ redis จะยังคง respawning

$ 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 เป็นพิเศษ แต่สำหรับเซิร์ฟเวอร์ทั่วไป:

ระบบปฏิบัติการหรือการกระจายสินค้าคืออะไร? บ่อยครั้งที่จะมีคำสั่งหยุดหรือ /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

หากคุณจำเป็นต้องทบทวนเกี่ยวกับสิทธิ์ลินุกซ์, ตรวจสอบนี้ แต่ปัญหาคือฉันกำลังดำเนินการรีสตาร์ทเนื่องจากผู้ใช้ของฉันซึ่งสิทธิ์ข้างต้นคือ rx ไม่อนุญาตให้ผู้ใช้ของฉันเขียนไปยังไดเรกทอรี PIDFile

เมื่อฉันรู้ว่าฉันเข้าสู่ระบบโดยใช้รูรันรันคำสั่งรีสตาร์ทบน 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

หากมีการตั้งค่าหรือสามารถตั้งค่าได้แทนที่จะค้นหา id กระบวนการ (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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.