ฉันกำลังเรียกใช้กระบวนการ 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) มันต้องการ&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.txtnohupต่อที่พิมพ์ PID มันเป็นขั้นสุดท้าย&ที่พื้นหลังมันเช่นls &จะแสดง PID สำหรับการทำงานls
                    2เป็นตัวอธิบายไฟล์ "ข้อผิดพลาดมาตรฐาน" >คือการเปลี่ยนเส้นทางของเชลล์และ&1เป็นตัวอธิบายไฟล์ "เอาต์พุตมาตรฐาน" ( &จำเป็นสำหรับที่นี่ดังนั้นเชลล์จะไม่คิดว่าฉันกำลังอ้างถึงชื่อไฟล์1) ดังนั้น2 > &1เปลี่ยนทิศทางเอาต์พุตข้อผิดพลาดมาตรฐานใด ๆ ไปยังอินพุตมาตรฐาน ตั้งแต่ก่อนที่> my.logหมายถึงการเปลี่ยนเส้นทางออกมาตรฐานเพื่อให้เราต้องมีวิธีเพื่อให้มั่นใจว่าข้อความผิดพลาดไปยังmy.log เพื่อให้แน่ใจว่าข้อผิดพลาดดังกล่าวไปออกมาตรฐานซึ่งในทางกลับไป ดูI / O เปลี่ยนเส้นทาง my.log2 > &1my.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 25938ps -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คุณต้องมองหาชื่อคำสั่งที่ไม่