จะรับรหัสกระบวนการเพื่อฆ่ากระบวนการ nohup ได้อย่างไร


204

ฉันกำลังเรียกใช้กระบวนการ nohup บนเซิร์ฟเวอร์ เมื่อฉันพยายามที่จะฆ่ามันคอนโซล putty ของฉันจะปิดแทน

นี่คือวิธีที่ฉันพยายามค้นหา ID กระบวนการ:

ps -ef |grep nohup 

นี่คือคำสั่งให้ฆ่า

 kill -9 1787 787

6
คุณพยายามที่จะฆ่ามันจากสคริปต์หรือที่บรรทัดคำสั่ง? คุณต้องบันทึก PID เมื่อคุณทำnohupและใช้มันในภายหลังเพื่อkillหากระบวนการโดยใช้ชื่อคำสั่งในps -efผลลัพธ์และรับ PID จากนั้น nohupคุณต้องมองหาชื่อคำสั่งที่ไม่
ครอบครอง

1
@ mbratch คุณควรตอบว่าแทนที่จะแสดงความคิดเห็น
Ansgar Wiechers

@ AnsgarWiechers ขอบคุณสำหรับคำแนะนำ บางครั้งถ้าคำตอบของฉันสั้นมากหรือถ้าฉันไม่แน่ใจว่ามันครอบคลุมสิ่งที่ OP ขอทั้งหมดฉันลังเลที่จะโพสต์มันเป็นคำตอบ ฉันได้เพิ่มคำตอบและรวมข้อมูลเพิ่มเติมแล้ว
ครอบครอง

คำตอบ:


353

เมื่อใช้งาน 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) มันต้องการ&11เพื่อให้เปลือกรู้ว่ามันอธิบายไฟล์ในบริบทที่แทนเพียงไฟล์ชื่อ 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

15
ความกระจ่างเล็กน้อยมันไม่ได้nohupต่อที่พิมพ์ PID มันเป็นขั้นสุดท้าย&ที่พื้นหลังมันเช่นls &จะแสดง PID สำหรับการทำงานls
karmakaze

1
'2> & 1' ทำอะไร
Viraj

4
@Viraj 2เป็นตัวอธิบายไฟล์ "ข้อผิดพลาดมาตรฐาน" >คือการเปลี่ยนเส้นทางของเชลล์และ&1เป็นตัวอธิบายไฟล์ "เอาต์พุตมาตรฐาน" ( &จำเป็นสำหรับที่นี่ดังนั้นเชลล์จะไม่คิดว่าฉันกำลังอ้างถึงชื่อไฟล์1) ดังนั้น2 > &1เปลี่ยนทิศทางเอาต์พุตข้อผิดพลาดมาตรฐานใด ๆ ไปยังอินพุตมาตรฐาน ตั้งแต่ก่อนที่> my.logหมายถึงการเปลี่ยนเส้นทางออกมาตรฐานเพื่อให้เราต้องมีวิธีเพื่อให้มั่นใจว่าข้อความผิดพลาดไปยังmy.log เพื่อให้แน่ใจว่าข้อผิดพลาดดังกล่าวไปออกมาตรฐานซึ่งในทางกลับไป ดูI / O เปลี่ยนเส้นทาง my.log2 > &1my.log
ซุ่มซ่าม

6
echo $!ให้ pid ของ nohup แก่ฉันแทนการวางกระบวนการ: paste.fedoraproject.org/428697/99695314
Nehal J Wani

1
@Mvorisek ทำหน้าที่เป็นตัวคั่นคำสั่งเพื่อให้คุณสามารถลอง& sh -c "nohup my_command > my.log 2>&1 & echo $! > save_pid.txt"อาจใช้งานได้ แต่ฉันไม่ได้ลอง
ครอบครอง

91

ฉันกำลังใช้ลินุกซ์ Red Hat บนเซิร์ฟเวอร์ VPS (และผ่าน SSH - putty) สำหรับฉันทำงานต่อไปนี้:

ก่อนอื่นคุณจะทำรายการกระบวนการทำงานทั้งหมด:

ps -ef

จากนั้นในคอลัมน์แรกคุณจะพบชื่อผู้ใช้ของคุณ ฉันพบว่าสามครั้งต่อไปนี้:

  • หนึ่งคือการเชื่อมต่อ SSH
  • ประการที่สองคือการเชื่อมต่อ FTP
  • อันสุดท้ายคือกระบวนการ nohup

จากนั้นในคอลัมน์ที่สองคุณสามารถค้นหา PID ของกระบวนการ nohup และคุณพิมพ์:

kill PID 

(แทนที่ PID ด้วย PID ของกระบวนการ nohup แน่นอน)

และนั่นคือมัน!

ฉันหวังว่าคำตอบนี้จะเป็นประโยชน์สำหรับใครบางคนฉันยังใหม่มากในการทุบตีและ SSH แต่พบ 95% ของความรู้ที่ฉันต้องการที่นี่ :)


3
ฉันคิดว่าคุณหมายถึง PID แทนที่จะเป็น UID ที่นี่ใช่ไหม
wprins

ฉันเห็นด้วยกับ @wprins การฆ่า UID นั้นไม่ได้ผลสำหรับฉัน แต่การฆ่า PID นั้นทำได้
Ryan

ในกรณีของฉันฉันรันสคริปต์เชลล์ทดสอบ (long_running_script.sh) โดยไม่มีตัวอักษรและ & และรู้วิธีหยุดมัน ในที่สุดฉันทำ ps -ef | grep long_running * และเพิ่ม PID PID ฆ่าแล้ว
Rennish Joseph

50

สมมติว่าฉันกำลังเรียกใช้สคริปต์ทับทิมในพื้นหลังด้วยคำสั่งด้านล่าง

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

1
แซนเจย์ดังนั้นฉันแน่ใจว่าฉันจะไม่พลาดอะไรเลยคำตอบของคุณคือส่วนใหม่หรือแตกต่างจากคำตอบที่ให้เมื่อหลายปีก่อน? ps -efและkillทั้งสองได้รับการคุ้มครองที่ดีข้างบนดังนั้นส่วนใหม่คืออะไร?
David C. Rankin

2
ps -ef จะให้รายการผลลัพธ์ที่มีความยาวและการค้นหาจากรายการที่มีความยาวนี้จะเป็นเรื่องยาก ดังนั้นฉันคิดว่า ps -ef | grep ruby ​​เป็นคำสั่งที่ดีกว่าในการค้นหา pid มากกว่าเพียงแค่ทำ ps -ef
Sanjay Salunkhe

20

jobs -lควรให้ pid แก่คุณสำหรับรายการกระบวนการ nohup ฆ่า (-9) เบา ๆ ;)


11
หากงานเริ่มต้นในเชลล์ปัจจุบันเท่านั้น และอย่าkill -9เว้นเสียแต่ว่าคุณรู้ว่าสัญญาณปกติไม่ทำงาน
tripleee

1
สิ่งนี้มีประโยชน์หากคุณอยู่ในอิมเมจนักเทียบท่าที่ไม่ได้ติดตั้ง ps :-)
Andreas Profous

5

คุณสามารถลอง

kill -9 `pgrep [command name]`

2
ดีมาก! ฉันใช้pkill [command name]คุณสามารถใช้การ-oตั้งค่าสถานะเพื่อฆ่ากระบวนการจับคู่ที่เก่าแก่ที่สุดหรือ-nใช้การตั้งค่าใหม่ล่าสุดแทน
zanona

4

งานนี้มา 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

ในที่สุดกระบวนการซอมบี้ก็หยุดลง


4

สมมติว่าคุณกำลังรันโปรแกรมจาวาด้วย 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}

2

เมื่อคุณสร้างงานใน nohup มันจะบอก ID กระบวนการ!

nohup sh test.sh &

ผลลัพธ์จะแสดง ID กระบวนการที่ชอบ

25013

คุณสามารถฆ่ามันแล้ว:

kill 25013

1

ฉันเริ่มเซิร์ฟเวอร์ django ด้วยคำสั่งต่อไปนี้

nohup manage.py runserver <localhost:port>

สิ่งนี้ใช้ได้กับ CentOS:

:~ ns$netstat -ntlp
:~ ns$kill -9 PID 

นี่คือการไปเพื่อแก้ไขprocess not foundความสับสนด้วย nohup
CodeSpent

0

วันนี้ฉันพบปัญหาเดียวกัน และเมื่อนานมานี้ฉันลืมคำสั่งที่ฉันใช้และเมื่อใด ฉันลองสามวิธี:

  1. ใช้ STIME ที่แสดงใน ps -efคำสั่ง สิ่งนี้แสดงเวลาที่คุณเริ่มกระบวนการและเป็นไปได้มากว่าคุณจะไม่ปล่อยให้คุณสั่งก่อนที่คุณจะปิด ssh (ขึ้นอยู่กับคุณ) น่าเสียดายที่ฉันไม่คิดว่าคำสั่งล่าสุดคือคำสั่งที่ฉันรันโดยใช้ nohup ดังนั้นสิ่งนี้จึงไม่ได้ผลสำหรับฉัน
  2. ประการที่สองคือ PPID ที่แสดงในps -efคำสั่งด้วย มันหมายถึง Parent Process ID, ID ของกระบวนการที่สร้างกระบวนการ ppid คือ 1 ใน Ubuntu สำหรับกระบวนการที่ใช้ nohup เพื่อเรียกใช้ จากนั้นคุณสามารถใช้ps --ppid "1"เพื่อรับรายการและตรวจสอบ TIME (เวลา CPU ทั้งหมดที่กระบวนการของคุณใช้) หรือ CMD เพื่อค้นหา PID ของกระบวนการ
  3. ใช้lsof -i:portหากกระบวนการครอบครองบางพอร์ตและคุณจะได้รับคำสั่ง จากนั้นก็เหมือนกับคำตอบข้างต้นใช้งานps -ef | grep commandแล้วคุณจะได้รับ PID

เมื่อคุณพบ PID ของกระบวนการแล้วสามารถใช้kill pidเพื่อเทอร์มินัลกระบวนการ

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