ฉันกำลังเรียกใช้กระบวนการ nohup บนเซิร์ฟเวอร์ เมื่อฉันพยายามที่จะฆ่ามันคอนโซล putty ของฉันจะปิดแทน
นี่คือวิธีที่ฉันพยายามค้นหา ID กระบวนการ:
ps -ef |grep nohup
นี่คือคำสั่งให้ฆ่า
kill -9 1787 787
ฉันกำลังเรียกใช้กระบวนการ nohup บนเซิร์ฟเวอร์ เมื่อฉันพยายามที่จะฆ่ามันคอนโซล putty ของฉันจะปิดแทน
นี่คือวิธีที่ฉันพยายามค้นหา ID กระบวนการ:
ps -ef |grep nohup
นี่คือคำสั่งให้ฆ่า
kill -9 1787 787
คำตอบ:
เมื่อใช้งาน nohup
และคุณวางงานในพื้นหลังตัวดำเนินการพื้นหลัง ( &
) จะให้ PID ที่พรอมต์คำสั่ง หากแผนของคุณคือจัดการกระบวนการด้วยตนเองคุณสามารถบันทึก PID นั้นและใช้ในภายหลังเพื่อฆ่ากระบวนการหากต้องการผ่านkill PID
หรือkill -9 PID
(ถ้าคุณต้องการบังคับให้ฆ่า) หรือคุณสามารถค้นหา PID ได้ในภายหลังโดยps -ef | grep "command name"
ค้นหา PID จากที่นั่น โปรดทราบว่าnohup
คำหลัก / คำสั่งเองไม่ปรากฏในps
ผลลัพธ์สำหรับคำสั่งที่เป็นปัญหา
หากคุณใช้สคริปต์คุณสามารถทำสิ่งที่ชอบ:
nohup my_command > my.log 2>&1 &
echo $! > save_pid.txt
สิ่งนี้จะรันmy_command
การบันทึกเอาต์พุตทั้งหมดลงในmy.log
(ในสคริปต์$!
หมายถึง PID ของกระบวนการล่าสุดที่ดำเนินการ) นี่2
คือไฟล์ descriptor สำหรับข้อผิดพลาดมาตรฐาน ( stderr
) และ2>&1
บอกให้เชลล์กำหนดเส้นทางเอาต์พุตข้อผิดพลาดมาตรฐานไปยังเอาต์พุตมาตรฐาน (file descriptor 1
) มันต้องการ&1
1
เพื่อให้เปลือกรู้ว่ามันอธิบายไฟล์ในบริบทที่แทนเพียงไฟล์ชื่อ 2>&1
เป็นสิ่งจำเป็นที่จะจับข้อผิดพลาดใด ๆ ที่ปกติจะมีการเขียนข้อผิดพลาดมาตรฐานของเราลงในmy.log
ไฟล์ (ซึ่งมาจากการส่งออกมาตรฐาน) ดูที่I / O Redirectionสำหรับรายละเอียดเพิ่มเติมเกี่ยวกับการจัดการ I / O redirection กับเชลล์
หากคำสั่งส่งเอาต์พุตเป็นประจำคุณสามารถตรวจสอบเอาต์พุตเป็นครั้งคราวด้วยtail my.log
หรือถ้าคุณต้องการติดตาม "live" ที่คุณสามารถtail -f my.log
ใช้ได้ สุดท้ายหากคุณต้องการฆ่ากระบวนการคุณสามารถทำได้ผ่าน:
kill -9 `cat save_pid.txt`
rm save_pid.txt
nohup
ต่อที่พิมพ์ PID มันเป็นขั้นสุดท้าย&
ที่พื้นหลังมันเช่นls &
จะแสดง PID สำหรับการทำงานls
2
เป็นตัวอธิบายไฟล์ "ข้อผิดพลาดมาตรฐาน" >
คือการเปลี่ยนเส้นทางของเชลล์และ&1
เป็นตัวอธิบายไฟล์ "เอาต์พุตมาตรฐาน" ( &
จำเป็นสำหรับที่นี่ดังนั้นเชลล์จะไม่คิดว่าฉันกำลังอ้างถึงชื่อไฟล์1
) ดังนั้น2 > &1
เปลี่ยนทิศทางเอาต์พุตข้อผิดพลาดมาตรฐานใด ๆ ไปยังอินพุตมาตรฐาน ตั้งแต่ก่อนที่> my.log
หมายถึงการเปลี่ยนเส้นทางออกมาตรฐานเพื่อให้เราต้องมีวิธีเพื่อให้มั่นใจว่าข้อความผิดพลาดไปยังmy.log
เพื่อให้แน่ใจว่าข้อผิดพลาดดังกล่าวไปออกมาตรฐานซึ่งในทางกลับไป ดูI / O เปลี่ยนเส้นทาง my.log
2 > &1
my.log
echo $!
ให้ pid ของ nohup แก่ฉันแทนการวางกระบวนการ: paste.fedoraproject.org/428697/99695314
&
sh -c "nohup my_command > my.log 2>&1 & echo $! > save_pid.txt"
อาจใช้งานได้ แต่ฉันไม่ได้ลอง
ฉันกำลังใช้ลินุกซ์ Red Hat บนเซิร์ฟเวอร์ VPS (และผ่าน SSH - putty) สำหรับฉันทำงานต่อไปนี้:
ก่อนอื่นคุณจะทำรายการกระบวนการทำงานทั้งหมด:
ps -ef
จากนั้นในคอลัมน์แรกคุณจะพบชื่อผู้ใช้ของคุณ ฉันพบว่าสามครั้งต่อไปนี้:
จากนั้นในคอลัมน์ที่สองคุณสามารถค้นหา PID ของกระบวนการ nohup และคุณพิมพ์:
kill PID
(แทนที่ PID ด้วย PID ของกระบวนการ nohup แน่นอน)
และนั่นคือมัน!
ฉันหวังว่าคำตอบนี้จะเป็นประโยชน์สำหรับใครบางคนฉันยังใหม่มากในการทุบตีและ SSH แต่พบ 95% ของความรู้ที่ฉันต้องการที่นี่ :)
สมมติว่าฉันกำลังเรียกใช้สคริปต์ทับทิมในพื้นหลังด้วยคำสั่งด้านล่าง
nohup ruby script.rb &
จากนั้นฉันจะได้รับ pid ของกระบวนการพื้นหลังข้างต้นโดยการระบุชื่อคำสั่ง ในคำสั่งกรณีของฉันคือทับทิม
ps -ef | grep ruby
เอาท์พุต
ubuntu 25938 25742 0 05:16 pts/0 00:00:00 ruby test.rb
ตอนนี้คุณสามารถฆ่ากระบวนการโดยใช้คำสั่ง kill
kill 25938
ps -ef
และkill
ทั้งสองได้รับการคุ้มครองที่ดีข้างบนดังนั้นส่วนใหม่คืออะไร?
jobs -lควรให้ pid แก่คุณสำหรับรายการกระบวนการ nohup ฆ่า (-9) เบา ๆ ;)
kill -9
เว้นเสียแต่ว่าคุณรู้ว่าสัญญาณปกติไม่ทำงาน
คุณสามารถลอง
kill -9 `pgrep [command name]`
pkill [command name]
คุณสามารถใช้การ-o
ตั้งค่าสถานะเพื่อฆ่ากระบวนการจับคู่ที่เก่าแก่ที่สุดหรือ-n
ใช้การตั้งค่าใหม่ล่าสุดแทน
งานนี้มา Ubuntu
พิมพ์สิ่งนี้เพื่อหา PID
ps aux | grep java
กระบวนการทำงานทั้งหมดที่เกี่ยวข้องกับ java จะปรากฏขึ้น
ในกรณีของฉันคือ
johnjoe 3315 9.1 4.0 1465240 335728 ? Sl 09:42 3:19 java -jar batch.jar
ตอนนี้ฆ่ามัน kill -9 3315
ในที่สุดกระบวนการซอมบี้ก็หยุดลง
สมมติว่าคุณกำลังรันโปรแกรมจาวาด้วย nohup คุณสามารถรับรหัสกระบวนการของจาวาได้
`ps aux | grep java`
เอาท์พุต
xxxxx 9643 0.0 0.0 14232 968 pts/2
จากนั้นคุณสามารถฆ่ากระบวนการโดยการพิมพ์
sudo kill 9643
หรือสมมุติว่าคุณต้องฆ่ากระบวนการ java ทั้งหมดจากนั้นก็ใช้
sudo killall java
คำสั่งนี้ฆ่าโปรเซสเซอร์ Java ทั้งหมด คุณสามารถใช้สิ่งนี้กับกระบวนการ เพียงแค่ให้ชื่อกระบวนการในตอนท้ายของคำสั่ง
sudo killall {processName}
เมื่อคุณสร้างงานใน nohup มันจะบอก ID กระบวนการ!
nohup sh test.sh &
ผลลัพธ์จะแสดง ID กระบวนการที่ชอบ
25013
คุณสามารถฆ่ามันแล้ว:
kill 25013
ฉันเริ่มเซิร์ฟเวอร์ django ด้วยคำสั่งต่อไปนี้
nohup manage.py runserver <localhost:port>
สิ่งนี้ใช้ได้กับ CentOS:
:~ ns$netstat -ntlp
:~ ns$kill -9 PID
process not found
ความสับสนด้วย nohup
วันนี้ฉันพบปัญหาเดียวกัน และเมื่อนานมานี้ฉันลืมคำสั่งที่ฉันใช้และเมื่อใด ฉันลองสามวิธี:
ps -ef
คำสั่ง สิ่งนี้แสดงเวลาที่คุณเริ่มกระบวนการและเป็นไปได้มากว่าคุณจะไม่ปล่อยให้คุณสั่งก่อนที่คุณจะปิด ssh (ขึ้นอยู่กับคุณ) น่าเสียดายที่ฉันไม่คิดว่าคำสั่งล่าสุดคือคำสั่งที่ฉันรันโดยใช้ nohup ดังนั้นสิ่งนี้จึงไม่ได้ผลสำหรับฉันps -ef
คำสั่งด้วย มันหมายถึง Parent Process ID, ID ของกระบวนการที่สร้างกระบวนการ ppid คือ 1 ใน Ubuntu สำหรับกระบวนการที่ใช้ nohup เพื่อเรียกใช้ จากนั้นคุณสามารถใช้ps --ppid "1"
เพื่อรับรายการและตรวจสอบ TIME (เวลา CPU ทั้งหมดที่กระบวนการของคุณใช้) หรือ CMD เพื่อค้นหา PID ของกระบวนการlsof -i:port
หากกระบวนการครอบครองบางพอร์ตและคุณจะได้รับคำสั่ง จากนั้นก็เหมือนกับคำตอบข้างต้นใช้งานps -ef | grep command
แล้วคุณจะได้รับ PIDเมื่อคุณพบ PID ของกระบวนการแล้วสามารถใช้kill pid
เพื่อเทอร์มินัลกระบวนการ
nohup
และใช้มันในภายหลังเพื่อkill
หากระบวนการโดยใช้ชื่อคำสั่งในps -ef
ผลลัพธ์และรับ PID จากนั้นnohup
คุณต้องมองหาชื่อคำสั่งที่ไม่