วิธีรับเฉพาะผู้ใช้ pid และคำสั่งรันสำหรับกระบวนการเฉพาะ (Ubuntu 11.10)


19

เมื่อฉันps -ef|grep pythonฉันได้รับต่อไปนี้:

myusername  4492  2994  0 10:32 pts/0    00:00:01 /home/myusername/.virtualenvs/myproject/bin/ipython manage.py runserver
root        6665     1  0 10:42 ?        00:00:00 /usr/bin/python /usr/lib/system-service/system-service-d
myusername 14051 13497  0 11:28 pts/7    00:00:00 grep --color=auto python

ฉันจะรับเฉพาะผู้ใช้ที่กำลังเรียกใช้โปรเซส, pidและคำสั่งรันสำหรับโปรเซสเหมือนกับในเอาต์พุตต่อไปนี้แทนได้อย่างไร?

myusername  4492 /home/myusername/.virtualenvs/myproject/bin/ipython manage.py runserver
root        6665 /usr/bin/python /usr/lib/system-service/system-service-d

มันใช้ได้ไหม? ps --fields="user pid command"
pratnala

ไม่ได้ลอง พบมันในเน็ต ไม่ได้อยู่ใกล้กับเครื่อง Ubuntu ในตอนนี้ ขอโทษ จะเห็นในภายหลังและแจ้งให้คุณทราบ
pratnala

ไม่ฉันได้รับข้อผิดพลาด: ไม่รู้จักตัวเลือก gnu long มันใช้งานได้สำหรับคุณหรือไม่
Bentley4

คำตอบ:


13

ฉันเดาว่าคุณกำลังมองหาอาร์กิวเมนต์ -o:

รูปแบบ -o:

รูปแบบที่ผู้ใช้กำหนด format เป็นอาร์กิวเมนต์เดี่ยวในรูปแบบของรายการที่คั่นด้วยช่องว่างหรือคั่นด้วยเครื่องหมายจุลภาคซึ่งมีวิธีการระบุคอลัมน์เอาต์พุตแต่ละรายการ คำสำคัญที่รู้จักนั้นมีการอธิบายไว้ในส่วนของมาตรฐานรูปแบบข้อมูลจำเพาะด้านล่าง ส่วนหัวอาจถูกเปลี่ยนชื่อ (ps -o pid, ruser = RealUser -o comm = Command) ตามต้องการ หากส่วนหัวคอลัมน์ทั้งหมดว่างเปล่า (ps -o pid = -o comm =) ดังนั้นบรรทัดส่วนหัวจะไม่ถูกส่งออก ความกว้างของคอลัมน์จะเพิ่มขึ้นตามความจำเป็นสำหรับส่วนหัวแบบกว้าง สิ่งนี้อาจใช้เพื่อขยายคอลัมน์เช่น WCHAN (ps -o pid, wchan = WIDE-WCHAN-COLUMN -o comm) มีการควบคุมความกว้างอย่างชัดเจน (ps opid, wchan: 42, cmd) พฤติกรรมของ ps -o pid = X, comm = Y แตกต่างกันไปตามบุคลิกภาพ เอาต์พุตอาจเป็นหนึ่งคอลัมน์ชื่อ "X, comm = Y" หรือสองคอลัมน์ชื่อ "X" และ "Y" ใช้ตัวเลือก -o หลายตัวเมื่อมีข้อสงสัย ใช้ตัวแปรสภาพแวดล้อม PS_FORMAT เพื่อระบุค่าเริ่มต้นตามที่ต้องการ DefSysV และ DefBSD เป็นมาโครที่อาจใช้เพื่อเลือกคอลัมน์ UNIX หรือ BSD เริ่มต้น

ดังนั้นคำสั่งที่คุณต้องการจะเป็น (Ubuntu):

ps -o uid,pid,cmd -ef|grep python

ภายใต้ OpenSolaris คำสั่งคือ:

ps -o ruser,pid,comm -ef|grep python

3
มันใช้งานได้จริงสำหรับคุณ? เมื่อฉันเรียกใช้คำสั่งนั้นฉันจะได้รับWarning: bad ps syntax, perhaps a bogus '-'? See http://procps.sf.net/faq.html
Bentley4

ใช่มันใช้งานได้สำหรับฉันเป็น ksh ภายใต้ OpenSolaris การส่งออกเป็นตามที่คุณต้องการ ... ตรวจสอบหน้าคนสำหรับ PS man psในระบบของคุณ บางทีไวยากรณ์อาจแตกต่างกันเล็กน้อยในระบบของคุณ
Simon

1
แต่ OP อยู่ในการทุบตีและไม่ใช่ใน ksh
pratnala

1
@ Bentley4 หากคุณต้องการคำสั่งและไม่ต้องการข้อมูลเพิ่มเติมคุณสามารถวางอาร์กิวเมนต์ -f และใช้คำสั่งต่อไปนี้:ps -o uid,pid,cmd -e|grep python
Simon

1
@ Bentley4:ps -o user,pid,cmd -e|grep '[p]ython'
Simon

3

วิธีที่ง่ายที่สุดน่าจะเป็น:

$ ps o uid=,pid=,cmd= -C python
1000 26126 python

ด้วยวิธีนี้คุณจะได้รับทุกสิ่งโดยตรงpsและไม่จำเป็นต้องแยกวิเคราะห์อะไร

จากpsหน้าคน:

รูปแบบ -o รูปแบบที่

ผู้ใช้กำหนด format เป็นอาร์กิวเมนต์เดี่ยวในรูปแบบของรายการที่คั่นด้วยช่องว่างหรือคั่นด้วยเครื่องหมายจุลภาคซึ่งมีวิธีการระบุคอลัมน์เอาต์พุตแต่ละรายการ [... ] ส่วนหัวอาจถูกเปลี่ยนชื่อ (ps -o pid, ruser = RealUser -o comm = Command) ตามต้องการ หากส่วนหัวคอลัมน์ทั้งหมดว่างเปล่า (ps -o pid = -o comm =) ดังนั้นบรรทัดส่วนหัวจะไม่ถูกส่งออก

-C cmdlist
     Select by command name.  This selects the processes whose executable 
     name is given in cmdlist.

-Cตัวเลือกที่จะทำงานถ้าคุณกำลังเรียกใช้pythonโต้ตอบไม่ได้ถ้าหลามกำลังเรียกใช้สคริปต์ ในกรณีนี้คุณควรใช้-C scriptname.pyแทน


1

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

ps ef | ตัด -c1-16,50-   

จะให้อักขระ 1-16 และ 50 เป็นต้นไปจากแต่ละบรรทัดของคำสั่ง ps ของคุณ (ตัวเลขจริงของคุณอาจต้องมีการนวดสักเล็กน้อย)

อีกวิธีในการทำ (แต่คุณจะฟอร์แมตหลวม) อาจเป็นได้

ps ef | tr -s "" | ตัด -f1,2,8- -d ""

ซึ่งจะบีบอัดช่องว่างในคำสั่ง ps จากนั้นใช้ฟิลด์ 1,2 และ 8 เป็นต้นไปและแสดง


สำหรับกระบวนการเดียวที่ฉันได้รับข้อมูลครึ่งหน้าเต็มหน้าจอด้วยคำสั่งเหล่านั้น มันอ่านไม่ได้สวยฉันกำลัง 'นวด' พารามิเตอร์ แต่จนถึงตอนนี้ฉันยังไม่สามารถรับสิ่งที่ฉันต้องการจากระยะไกล
Bentley4

1
ps -eo user,pid,cmd | grep [p]ython

ตัวอย่าง:

$ ps -eo user,pid,cmd | grep [p]ython
root      1056 /usr/bin/python3 /usr/bin/networkd-dispatcher --run-startup-triggers
root      1735 /usr/bin/python3 /usr/bin/fail2ban-server -xf start
bmaupin  16613 /usr/bin/python3 /usr/share/system-config-printer/applet.py

คำอธิบาย:

  • -e กระบวนการทั้งหมด
  • -o รูปแบบที่ผู้ใช้กำหนด
  • user,pid,cmd แสดงผู้ใช้ ID กระบวนการคอลัมน์คำสั่ง

หมายเหตุ:หากคุณใช้-fกับ-eตามที่คนอื่นแนะนำคุณอาจได้รับข้อผิดพลาด นี่เป็นเพราะพารามิเตอร์เหล่านี้ทั้งสองควบคุมรูปแบบผลลัพธ์และควรใช้หนึ่งในพารามิเตอร์เท่านั้น:

$ ps --help | grep -A 2 "output format"
*********** output format **********
-o,o user-defined  -f full
-j,j job control   s  signal
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.