ไม่สามารถหยุดเซิร์ฟเวอร์ราง


126

ฉันยังใหม่กับรางและฉันใช้เครื่อง Ubuntu และ rubymine IDE ปัญหาคือฉันไม่สามารถหยุดเซิร์ฟเวอร์รางได้ ฉันพยายามหยุดเซิร์ฟเวอร์โดยการฆ่ากระบวนการทางรถไฟ แต่เมื่อฉันเรียกใช้pgrep -l railsไม่พบกระบวนการดังกล่าว ดังนั้นฉันสามารถฆ่ากระบวนการทับทิมได้เท่านั้น แต่เซิร์ฟเวอร์จะไม่หยุด

ฉันพยายาม./script/server stop(ตั้งแต่เริ่มวิ่ง./script/server start) แต่ก็ไม่ได้ผล Googling ไปรอบ ๆ และค้นหาโพสต์ stackoverflow ฉันพยายามเปลี่ยนพอร์ตการฟังของพอร์ต localhost แต่ไม่ประสบความสำเร็จ มีใครช่วยได้บ้าง


2
=> Ctrl-C เพื่อปิดเซิร์ฟเวอร์
gabrielhilal

@ นิวเบนคุณต้องการฆ่ากระบวนการทั้งหมดหรือไม่?
ผู้เรียน

@ ศรีใช่ฉันต้องการฆ่ากระบวนการทั้งหมด
epsilones

1
@Newben ตรวจสอบคำตอบที่อัปเดตของฉันด้านล่างและลองแจ้งให้เราทราบ
ผู้เรียน

คำตอบ:


303

คุณสามารถใช้พอร์ตอื่น ๆ ดังต่อไปนี้:

rails server -p 3001

โดยปกติในเทอร์มินัลของคุณคุณสามารถลองCtrl + Cปิดเซิร์ฟเวอร์ได้

อีกวิธีหนึ่งในการฆ่าเซิร์ฟเวอร์เริ่มต้นของ Ruby on Rails (ซึ่งก็คือWEBrick):

kill -INT $(cat tmp/pids/server.pid)

ในเทอร์มินัลของคุณเพื่อค้นหา PID ของกระบวนการ:

$ lsof -wni tcp:3000

จากนั้นใช้ตัวเลขในคอลัมน์ PID เพื่อฆ่ากระบวนการ:

ตัวอย่างเช่น:

$ kill -9 PID

และคำตอบอื่น ๆ ที่ฉันพบคือ:

หากต้องการหยุดเซิร์ฟเวอร์รางในขณะที่กำลังทำงานให้กด:

CTRL-C
CTRL-Z

bashคุณจะได้รับการควบคุมกลับไป จากนั้นพิมพ์ (ไม่มี$):

$ fg

และสิ่งนี้จะกลับเข้าสู่กระบวนการและเลิกใช้Rails sอย่างถูกต้อง

มันน่ารำคาญเล็กน้อย แต่แน่นอนว่านี่เป็นการฆ่ากระบวนการด้วยตนเอง มันไม่เลวร้ายเกินไปและเป็นสิ่งที่ดีที่สุดที่ฉันคิดได้

คำตอบที่อัปเดต:

คุณสามารถใช้killall -9 railsเพื่อฆ่าแอปที่กำลังทำงานอยู่ทั้งหมดโดยใช้ " rails" ในชื่อ

killall -9 rails


ขออภัย lsof -wni tcp: 3000 คืนค่าอะไรและฉันไม่มี tmp / pids / folder ใด ๆ
epsilones

หาก Webrick ทำงานอยู่แสดงว่า PID อยู่ใน{APP_ROOT}/tmp/pids/server.pidไฟล์ดังนั้นคุณไม่ต้องมองหาตราบใดที่เซิร์ฟเวอร์ยังทำงานอยู่ ดังนั้นหากแทนที่จะctrl-cเรียกใช้คำสั่ง kill ในเทอร์มินัลอื่นมันจะฆ่าเซิร์ฟเวอร์ Webrick ทันที
ผู้เรียน

เมื่อฉันรัน killall -9 รางฉันได้รับข้อความแจ้งว่า 'ไม่พบกระบวนการดังกล่าว' ??
epsilones

Btw โฟลเดอร์ {APP_ROOT} / tmp / pids / มีอยู่จริง แต่ว่างเปล่า
epsilones

1
คำสั่งเหล่านี้ไม่ได้ทำอะไรให้ฉันเลย อย่างไรก็ตามการรีบูตเครื่องช่วยแก้ปัญหาได้
Herb Meehan

51

คุณสามารถใช้คำสั่ง grep ได้ดังต่อไปนี้

ps aux | grep rails

แล้ว

kill -9 {process_id} 

อันที่จริง commnad นี้จับเฉพาะ '0:00 grep --color = auto rail' ซึ่งฉันเดาว่า grep เรียกว่า command ...
epsilones

ขอบคุณโซลูชันนี้ที่ใช้งานได้กับเซิร์ฟเวอร์ที่ยังคงทำงานแม้เทอร์มินัลบังคับปิด Nice
ksugiarto

แล้วถ้าฉันมีกระบวนการมากมายและไม่อยากฆ่าพวกมันทีละกระบวนการล่ะ?
Nickolay Kondratenko

คุณสามารถฆ่าพวกมันทั้งหมดได้ภายในkillall -9 rails
maximus ツ

เพื่อค้นหาเซิร์ฟเวอร์ที่ฉันต้องทำps aux | grep puma
Sami Birnbaum

27

pkill -9 rails เพื่อฆ่ากระบวนการทางรถไฟทั้งหมด

คำตอบที่อัปเดต

ps aux|grep 'rails'|grep -v 'grep'|awk '{ print $2 }'|xargs kill -9

สิ่งนี้จะฆ่ากระบวนการทางวิ่งใด ๆ แทนที่ 'ราง' ด้วยอย่างอื่นเพื่อฆ่ากระบวนการอื่น ๆ


18

ต่อไปนี้เป็นขั้นตอนในการฆ่ากระบวนการเซิร์ฟเวอร์:

1. lsof -i tcp:3000

2. kill -9 1234

ที่1234เป็น PID ของกระบวนการ: localhost: 3000 แสดงอยู่ในขั้นตอนที่ 1

หรือ

ลบไฟล์ (server.pid) ภายใต้Rails.root/tmp/pids/และรีสตาร์ทเซิร์ฟเวอร์

หรือ

เปิดแอปในพอร์ตอื่นโดยใช้คำสั่ง:

rails s -p 3001


15

บน MAC ของฉันkillall -9 railsไม่ทำงาน แต่killall -9 rubyไม่


เหมือนกัน. นั่นคือCOMMANDคุณค่าเช่นกัน
IIllIIll

10

โดยทั่วไปฉันใช้:

killall ruby

หรือ

pkill -9 ruby

ซึ่งจะฆ่าทุกกระบวนการที่เกี่ยวข้องทับทิมที่มีการทำงานเหมือนrails server, rails consoleฯลฯ


หากคุณไม่รู้จัก pkill -9 หรือ kill -9 คุณควรสังเกตว่าสิ่งนี้สามารถฆ่ากระบวนการทับทิมอื่น ๆ ได้เช่นกันเช่น rubymine IDE
Kjell

4

1. เพียงแค่ลบไฟล์ pid จากไดเร็กทอรีแอพทางรถไฟ

Rails_app -> tmp -> pids -> pid file

ลบไฟล์และเรียกใช้

rails start


2. สำหรับ Rails 5.0 ขึ้นไปคุณสามารถใช้คำสั่งนี้

rails restart


3

ใช้ctrl+cเพื่อปิดเซิร์ฟเวอร์ Webrick ของคุณ

น่าเสียดายหากใช้งานไม่ได้ให้ปิดเทอร์มินัลแรง ๆ แล้วรีสตาร์ท

เคล็ดลับอีกอย่างคือ

1. open your system-monitor(a gui application) on ubuntu

2. Select processes tab 

3. Then look for a process having name 'ruby'

4. End that process

แม้คุณจะรีสตาร์ทบางครั้งเซิร์ฟเวอร์กำลังทำงาน เพราะเราจำเป็นต้องฆ่า temp / pid เพื่อหยุดเซิร์ฟเวอร์
ผู้เรียน

แต่โดยปกติการยุติเทอร์มินัลจะหยุดกระบวนการ bcoz กระบวนการเบื้องหน้าและทำงานบนเทอร์มินัล
Gopal S Rathore

3

ลบ server.pid จากโฟลเดอร์ tmp / pids ในกรณีของฉันข้อผิดพลาดคือ: เซิร์ฟเวอร์กำลังทำงานอยู่ ตรวจสอบ /home/sbhatta/myapp/tmp/pids/server.pid

ดังนั้นฉันจึงลบ server.pid

rm /home/sbhatta/myapp/tmp/pids/server.pid จากนั้นเรียกใช้ rails s


3

ขั้นตอนที่ 1:ค้นหารายการที่ใช้พอร์ต 3000

lsof -i:3000

ขั้นตอนที่ 2:ค้นหากระบวนการที่ชื่อ

สำหรับ Mac

ruby      TCP localhost:hbci (LISTEN)

สำหรับ Ubuntu

ruby      TCP *:3000 (LISTEN)

ขั้นตอนที่ 3:ค้นหา PID ของกระบวนการและฆ่ามัน

kill -9 PID


2

ผมใช้killall -9 railsเหมือนที่ศรีแนะนำแล้วไม่ได้ผล ฉันปรับคำสั่งเป็นkillall -9 rubyและเซิร์ฟเวอร์ปิดทันที

tl; DR: killall -9 ruby



1

เมื่อเซิร์ฟเวอร์รางไม่เริ่มทำงานหมายความว่าเซิร์ฟเวอร์กำลังทำงานอยู่แล้วคุณสามารถเริ่มต้นได้โดยใช้พอร์ตใหม่เช่น

rails s -p 3001

หรือเริ่มต้นและหยุดในกรณีนั้นคุณต้องการลบโฟลเดอร์ temp ในโครงสร้างไดเร็กทอรีรางซึ่งจะเริ่มต้นเซิร์ฟเวอร์ราง


1

ตรวจสอบ /tmp/tmp/server.pid

มี pid อยู่ข้างใน

โดยปกติแล้วฉันมักจะ "ฆ่า -9 THE_PID" ใน cmd


ฉันไม่มีเส้นทางนี้มันจะอยู่ที่ไหนในเครื่อง Ubuntu?
epsilones

มันถูกซ่อนอยู่ ... ไปที่โฟลเดอร์แอพของคุณ ctrl + H เพื่อแสดงไฟล์ที่ซ่อนอยู่จากนั้นคุณสามารถดูได้
Nich

1

ฉันสังเกตเห็นใน Windows (ฉันใช้ 10 แต่ไม่แน่ใจว่าเหมือนกันกับ oler หรือไม่) หากคุณใช้ cmd.exe และ ctrl + c เซิร์ฟเวอร์ raisl จะหยุดทำงานอย่างถูกต้อง

อย่างไรก็ตามหากคุณใช้ Git Bash ก็จะไม่ มันบอกว่ามันมี แต่เมื่อคุณดูที่ tmp pids มันก็ยังอยู่

อาจจะมีข้อผิดพลาดกับ git bash?


1

killall -9 rubyจะฆ่ากระบวนการทับทิมทั้งหมดและอย่างน้อยที่สุดบนเครื่องของฉันเซิร์ฟเวอร์รางจะปรากฏเป็นกระบวนการทับทิม killall -9 railsมีความเฉพาะเจาะจงมากขึ้นและไม่ทำงานกับเซิร์ฟเวอร์รางรุ่นเก่า (มันให้ 'ราง: ไม่พบกระบวนการ' เนื่องจากกระบวนการนี้มีชื่อว่าทับทิม)

พบปัญหานี้เมื่อสักครู่ที่ผ่านมา หลังจากส่งแบบฟอร์มใน activeadmin เซิร์ฟเวอร์รางก็แฮงค์และฉันไม่สามารถฆ่าได้โดยใช้วิธีการปกติ (แม้หลังจาก ctrl + z แล้วก็ยังทำงานอยู่เบื้องหลัง) คำตอบของผู้เรียนช่วยได้ แต่คำสั่งนี้ไม่จำเป็นต้องใช้รหัสกระบวนการ


0

มันสายไปแล้วสำหรับคำถามนี้ นี่คือ 2 เซ็นต์ของฉัน ฉันทำงานคราดเพื่อหยุดเซิร์ฟเวอร์เมื่อฉันไม่สามารถเข้าถึงได้ ฉันทดสอบบน Mac เท่านั้น

ด้วยวิธีนี้คุณสามารถเพิ่มลงในโปรเจ็กต์ของคุณจากนั้นเรียกใช้คำสั่งคราด

ได้แล้ว:

ลิงก์ Gist: - เวอร์ชันล่าสุดจะอยู่ที่นี่ https://gist.github.com/houmanka/289184ca5d8d92de0499#file-server-rake

รหัสบางส่วนในที่นี่:

# Make a file under: `project_root/lib/tasks/server.rake`

# Then paste the following code

    namespace :server do
      desc "Stop the running server by killing the PID"
      task :kill do
        STDOUT.puts "Enter port number: "
        post_number = STDIN.gets.strip
        system "pid=$(lsof -i:#{post_number.to_i} -t); kill -TERM $pid || kill -KILL $pid"
      end
    end

# Then to use it in the terminal: `rake server:kill`

0

ตรวจสอบให้แน่ใจว่าคุณกำลังใช้คำสั่ง Cntrl + C ในเทอร์มินัล (แท็บ) เดียวกันซึ่งใช้ในการเริ่มต้นเซิร์ฟเวอร์

ในกรณีของฉันฉันมี 2 แท็บ แต่ฉันลืมหยุดเซิร์ฟเวอร์จากแท็บที่ถูกต้องและฉันสงสัยว่าทำไม Cntrl + C ไม่ทำงาน


0

วิธีหนึ่งที่ง่ายสุด ๆ ก็คือ

gem install shutup

จากนั้นไปที่โฟลเดอร์ปัจจุบันของโครงการรางของคุณและเรียกใช้

shutup # สิ่งนี้จะฆ่ากระบวนการ Rails ที่กำลังทำงานอยู่

คุณสามารถใช้คำสั่ง 'shutup' ได้ทุกครั้งที่ต้องการ

DICLAIMER: ฉันเป็นผู้สร้างอัญมณีนี้

หมายเหตุ: หากคุณใช้ rvm ให้ติดตั้งอัญมณีทั่วโลก

rvm @global do gem install shutup


0

เราสามารถฆ่าเซสชันรางบน Linux โดยใช้ PORT no

fuser -k 3000/tcp 

ที่นี่ 3000 คือหมายเลขพอร์ต ตอนนี้รีสตาร์ทเซิร์ฟเวอร์ของคุณคุณจะเห็นเซิร์ฟเวอร์ของคุณอยู่ในสถานะทำงาน


0

ทำตามขั้นตอนเหล่านี้:

  1. เปิดโครงการของคุณ
  2. เลือกในโฟลเดอร์ tmp
  3. เลือกโฟลเดอร์ pids
  4. ลบไฟล์ server.pid
  5. ตอนนี้เริ่มเซิร์ฟเวอร์รางของคุณ

ไม่ทำงานบนแอปพลิเคชันราง 5.2 ของฉัน Address already in use - bind(2) for "127.0.0.1" port 3000 (Errno::EADDRINUSE)
a.barbieri

0
  1. เพียงแค่เปิดไฟล์โดยใช้ตำแหน่งที่กำหนด sudo vi /Users/user1/go/src/github.com/rails_app/rails_project/tmp/pids/server.pid

  2. ค้นหา process_id / thread_id ที่กระบวนการรันนิ่ง

  3. ฆ่ากระบวนการ / เธรดที่ระบุโดยใช้ kill -9 84699


0

บนราง 6 โดยใช้

ps aux | grep rails ไม่ได้ส่งคืนกระบวนการเซิร์ฟเวอร์

ฉันต้องทำ

ps aux | grep puma

เพื่อค้นหากระบวนการที่แท้จริงแล้วฆ่ามันโดยใช้

kill -9 {process_id}


0

หากคุณใช้ Rails เวอร์ชันที่ทันสมัยกว่าและใช้ Puma เป็นเว็บเซิร์ฟเวอร์คุณสามารถเรียกใช้คำสั่งต่อไปนี้เพื่อค้นหากระบวนการ Puma ที่ติดขัด:

ps aux | grep puma

จะให้ผลลัพธ์คล้ายกับสิ่งนี้:

85923 100.0  0.8  2682420 131324 s004  R+    2:54pm   3:27.92 puma 3.12.0 (tcp://0.0.0.0:3010) [my-app]
92463   0.0  0.0  2458404   1976 s008  S+    3:09pm   0:00.00 grep puma

คุณต้องการกระบวนการที่ไม่ได้อ้างถึง grepคุณต้องการกระบวนการที่จะไม่ได้หมายถึงในกรณีนี้ ID กระบวนการคือ 85923

จากนั้นฉันสามารถรันคำสั่งต่อไปนี้เพื่อฆ่ากระบวนการนั้น:

kill -9 85923

ป้อนคำอธิบายภาพที่นี่

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