วิธีการตรวจสอบกระบวนการกำลังทำงานอยู่หรือไม่


32

ฉันต้องการตรวจสอบกระบวนการเฉพาะในการทำงานหรือไม่

ฉันอ่านคำถามและคำตอบนี้

แต่ฉันไม่ได้รับการแก้ปัญหาเฉพาะใด ๆ ต่อไปนี้เป็นตัวอย่างที่ฉันพยายาม: ฉันได้สร้างไฟล์และเรียกใช้สคริปต์นี้บนพื้นหลังเช่นabc.shsh abc.sh &

ตอนนี้ไฟล์นี้กำลังทำงานบนพื้นหลังและฉันใช้ps aux | grep "abc"คำสั่ง

ต่อไปนี้เป็นผลลัพธ์ของคำสั่งนี้:

prakash     3594  0.0  0.0   4388   820 pts/0    S+   16:44   0:00 grep --color=auto abc

หลังจากนั้นฉันหยุดabc.shสคริปต์ทำงานและยิงคำสั่งเดียวกันps aux | grep "abc"คำสั่ง

แต่ฉันได้รับผลลัพธ์เดียวกันเช่น:

prakash     3594  0.0  0.0   4388   820 pts/0    S+   16:44   0:00 grep --color=auto abc

มีวิธีอื่นในการค้นหากระบวนการที่กำลังทำงานอยู่หรือไม่?

คำตอบ:


41

ทุกกระบวนการจะถูกระบุไว้ในผลลัพธ์ของps aux; ไม่ว่าจะทำงานนอนหลับซอมบี้หรือหยุดทำงาน

อย่างไรก็ตามในกรณีของคุณเนื่องจากคุณวิ่งขั้นตอนโดยใช้sh abc.sh, shเป็นโปรแกรม (เปลือก) abc.shที่ทำงานและไม่ได้ ดังนั้นps auxจะไม่ประกอบด้วยกระบวนการabc.shเพราะสิ่งที่grepไม่สามารถให้ผลลัพธ์ใด ๆ

ดังนั้นวิธีที่ถูกต้องที่คุณควรใช้คือ:

ps aux | grep sh

นอกจากนี้ยังอาจจะกลับมาที่คุณกระบวนการอื่น ๆ ที่กำลังทำงานอยู่มีสตริงที่ใดก็ได้ในการส่งออกของพวกเขาshps aux

คุณควรทราบว่าการที่จะ "ทำงาน" เมื่อการส่งออกของps auxมีของเป็นSTAT Rถ้ามันเป็นอย่างอื่นมันจะไม่ทำงานที่อินสแตนซ์ที่คุณสั่งให้ใช้เพื่อตรวจสอบกระบวนการทำงาน สถานะกระบวนการที่แตกต่างกันสามารถพบได้ใน man page สำหรับ ps:

D    uninterruptible sleep (usually IO)
R    running or runnable (on run queue)
S    interruptible sleep (waiting for an event to complete)
T    stopped, either by a job control signal or because it is being traced
W    paging (not valid since the 2.6.xx kernel)
X    dead (should never be seen)
Z    defunct ("zombie") process, terminated but not reaped by its parent

คุณสามารถเรียกใช้topคำสั่งเพื่อตรวจสอบว่ากระบวนการกำลังทำงานหรือหลับอยู่และปริมาณของ CPU, RAM ที่ใช้ไปหรือไม่ (นี่จะแสดงรายการกระบวนการของคุณอีกครั้งsh)

อย่างไรก็ตามหากคุณต้องการให้กระบวนการของคุณอยู่ในรายการabc.shคุณควรมีบรรทัดแรกของสคริปต์ที่คุณใช้เป็น:

#!/bin/sh

เพื่อให้เชลล์จะรู้ว่าแอปพลิเคชันใดที่จะใช้ในการเรียกใช้สคริปต์ (ในกรณีนี้ให้เปลี่ยนเป็น#!/bin/bashbash) จากนั้นให้สิทธิ์อนุญาตในการเรียกใช้กระบวนการโดยใช้:

chmod +x /path/to/abc.sh

แทนที่/path/to/ด้วยตำแหน่งของabc.shไฟล์จากนั้นรันabc.shโดยใช้

/path/to/abc.sh

แทนที่/path/to/ด้วยตำแหน่งของabc.shไฟล์อีกครั้ง


2
คำถามด่วนหนึ่งข้อ stat S+หมายถึงอะไร
Prakash V Holkar

แต่คุณสามารถค้นหาความแตกต่างระหว่างกระบวนการที่กำลังทำงานอยู่และไม่ได้ทำการประมวลผลผ่านเอาต์พุตของps aux | grep filenameคำสั่ง
Avinash Raj

@TechGuru: หมายความว่ากระบวนการกำลังทำงานอยู่เบื้องหน้าให้อ้างอิงกับหน้าคู่มือของ ps สำหรับข้อมูลเพิ่มเติม
jobin

@AvinashRaj: ใช่แน่นอนคุณสามารถ
jobin

ฉันได้รับข้อผิดพลาด: ข้อผิดพลาดให้ทำเช่นนี้: mount -t proc proc / proc
IgorGanapolsky

7

ปัญหาของฉันgrepคือมันเป็น parser ทั้งบรรทัด ในตัวอย่างของคุณคุณกำลังค้นหา "abc" แต่มันกำลังดึงอินสแตนซ์ของgrep(ที่กำลังค้นหา "abc") วงกลมสักหน่อย คุณสามารถกรองออก แต่ฉันพบทุกสิ่งที่ผิดปกติเล็กน้อย

ฉันจะหันไปawkแต่งตัวสวยหน่อย

ps aux | awk '$12=="abc.sh"'

awkแยกบรรทัดออกเป็นฟิลด์ตามช่องว่าง (ตามค่าเริ่มต้น) ทุ่ง $ 11 + มีคอลัมน์คำสั่ง (s) ดังนั้นหากคำสั่งคือ "ดวลจุดโทษ abc.sh ..." $11จะเป็นshและจะเป็น$12abc.sh

หากคุณต้องการควบคุมเอาท์พุทหรือการโยงกับ Bash's &&และ||โอเปอเรเตอร์คุณสามารถทำได้ แต่คุณจะต้องฉลาดกว่านี้อีกเล็กน้อย grepจะออกด้วยรหัสสถานะ 1 (ความล้มเหลวทางเทคนิคทริกเกอร์||) หากไม่พบ แต่awkจะออกจากรหัส 0 เราสามารถเปลี่ยนสิ่งนี้ได้โดยบอกให้ออกหากพบบางอย่างและโยน 1 หากไม่:

ps aux | awk '$12=="abc.sh" {exit 0} END{exit 1}' && echo running || echo not running

แน่นอนถ้าคุณเพียงแค่สนใจเกี่ยวกับการเขียนผลลัพธ์ไปยังหน้าจอคุณสามารถทำได้ทั้งหมดในawk:

ps aux | awk '$12=="abc.sh" {print "running"; exit} END{print "not running"}'

4

วิธีที่ถูกต้องในการตรวจสอบในเซสชั่นทุบตีปัจจุบันหากกระบวนการเริ่มต้นในพื้นหลังเช่นsh abc.sh &กำลังทำงานอยู่หรือไม่คือการใช้jobsคำสั่ง builtin

ตัวอย่าง:

$ sh abc.sh &
[1] 6917
$ jobs
[1]+  Running                 sh abc.sh &

นั่นหมายความว่าsh abc.shกระบวนการเริ่มต้นในพื้นหลังกำลังทำงาน หากกระบวนการเสร็จสิ้นคุณจะเห็นสิ่งต่อไปนี้:

[1]+  Done                    sh abc.sh

หากคุณมีกระบวนการที่ทำงานอยู่เบื้องหลังมากขึ้นคุณสามารถ จำกัด ผลลัพธ์เฉพาะ sh abc.shกระบวนการโดยใช้:

jobs sh

ดูhelp jobsข้อมูลเพิ่มเติม

วิธีการดังกล่าวจะทำงานเฉพาะในเซสชั่นปัจจุบันของการทุบตี แต่ถ้าคุณอยู่ในเซสชั่นทุบตีอื่น (เช่นในหน้าต่างเทอร์มินัลหรือแท็บอื่นหรือในสคริปต์) นอกเหนือจาก:

ps aux | grep "[s]h bin/test.sh"

คุณสามารถใช้:

pgrep -a sh

ซึ่งดูเหมือนจะง่ายขึ้นสำหรับฉัน หากคุณจะเห็นคำสั่งพิมพ์ของคุณในผลลัพธ์ ( sh abc.shในกรณีนี้) นั่นหมายความว่ากระบวนการยังคงทำงานอยู่ ถ้าไม่กระบวนการเสร็จสิ้น


3

หากสคริปต์ของคุณกำลังทำงานอยู่สคริปต์นั้นจะต้องแสดงโดยps auxคำสั่ง หากไม่ปรากฏขึ้นแสดงpsว่าอาจมีการดำเนินการสคริปต์ของคุณในตอนนี้

ผลลัพธ์psเช่นนี้หมายความว่าสคริปต์ของคุณไม่ได้ทำงานอยู่ในขณะนี้

$ ps aux | grep hm.sh
avinash   6386  0.0  0.0  15940   932 pts/16   S+   17:34   0:00 grep --color=auto hm.sh

ถ้ามันแสดงเช่นนี้ซึ่งหมายความว่าสคริปต์ของคุณกำลังทำงานอยู่

$ ps aux | grep hm.sh
avinash   6454  0.0  0.0  16616  1384 pts/16   S+   17:35   0:00 /bin/bash ./hm.sh
avinash   6535  0.0  0.0  15940   932 pts/27   R+   17:35   0:00 grep --color=auto hm.sh

ทุกอย่างขึ้นอยู่กับเนื้อหาของสคริปต์

ตัวอย่างเช่นหากคุณสร้างสคริปต์เช่นนี้ จะแสดงข้อความ HI ในการดำเนินการ ใช้เวลาสองสามวินาทีในการแสดงเอาต์พุตและถูกยกเลิกหลังจากสร้างผลลัพธ์สุดท้าย

#!/bin/bash
echo "HI"

แต่ถ้าสคริปต์ของคุณเป็นแบบนี้

#!/bin/bash
sudo apt-get update

ใช้เวลาสักครู่เพื่อให้กระบวนการยุติลง ในขณะเดียวกันถ้าคุณเรียกใช้ps aux | grep filenameคำสั่งมันจะปรากฏในผลลัพธ์ เพราะสคริปต์กำลังทำงานอยู่


-2
  • หากคุณต้องการตรวจสอบกระบวนการทั้งหมดให้ใช้ 'บนสุด'

  • ถ้าคุณต้องการทราบกระบวนการที่รันโดย java ให้ใช้ ps -ef | grep java

  • หากกระบวนการอื่น ๆ เพียงแค่ใช้ps -ef | grep xyzหรือเพียงแค่/etc/init.d xyz status

  • ถ้าผ่านรหัสใด ๆ เช่น.shนั้น./xyz.sh status


1
-1 ในขณะที่คำสั่งเหล่านี้มีประโยชน์ภายใต้สถานการณ์บางอย่างพวกเขาจะยังคงไร้ประโยชน์กับคนที่ไม่รู้สถานการณ์เหล่านี้ ในแต่ละกรณีคุณอาจอธิบายไม่เพียงพอหรือคำอธิบายของคุณผิด
David Foerster

-2

หากคุณเพียงแค่ต้องการตรวจสอบว่ามีกระบวนการใด ๆ อยู่ภายใต้กระบวนการให้ไปที่ไดเรกทอรีและพิมพ์ll -trถ้าคุณเห็น.csvหรือ.workอื่น ๆ ในตอนท้ายของไฟล์ก็หมายความว่าภายใต้กระบวนการอื่นไม่


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