“ ps -u” เป็นไวยากรณ์ที่ไม่ถูกต้องจริงหรือ


75

IMHO ps -uแสดงผลลัพธ์ที่มีประโยชน์มากดีกว่าps -u $USER:

$ ps -u
Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
elastic   234897  0.0  0.0 105980  1336 pts/2    S+   Oct10   0:00 /bin/bash ./run.sh collector-json-1.conf
elastic   234899 48.7  7.1 10087120 4433104 pts/2 Sl+ Oct10 2804:11 /usr/java/jdk1.7.0_09_x64/bin/java -Xmx6144m -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -Djava.awt.headless=true -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatin
:

เปรียบเทียบกับ

$ ps -u $USER
    PID TTY          TIME CMD
 234897 pts/2    00:00:00 run.sh
 234899 pts/2    1-22:44:04 java
:
  1. แต่ทำไม "ไวยากรณ์ไม่ดี" /usr/share/doc/procps-3.2.8/FAQไม่ได้ช่วยอะไรมาก
  2. สิ่งที่จะเป็น "ไวยากรณ์ที่เหมาะสม" เพื่อให้ได้ผลลัพธ์เดียวกันแน่นอน

ในกรณีที่สำคัญ:

$ uname -a
Linux h22k34.local 2.6.32-042stab044.17 #1 SMP Fri Jan 13 12:53:58 MSK 2012 x86_64 x86_64 x86_64 GNU/Linux

5
และสำหรับส่วนที่ยากลำบาก: คำตอบใดควรได้เครื่องหมายถูก?
sjngm

ที่จริงฉันคิดว่าฉันควรให้คุณผู้ใช้ตัดสินใจ ผู้ที่มีคะแนนสูงสุดควรได้รับ แต่คุณไม่ได้ทำให้เรื่องนี้ง่ายขึ้น)
sjngm

6
เมื่อทั้งสองคำตอบดีพอ ๆ กันฉันก็โหวตทั้งคู่และให้เครื่องหมายถูกกับผู้ใช้ที่มีตัวแทนต่ำกว่าโดยเฉพาะเมื่อความแตกต่างมากกว่า 100k
Frank Thomas

1
@FrankThomas เสร็จแล้ว :)
sjngm

บนระบบที่ใช้ SysV (หรือระบบที่psมาจากสายของสิ่งนั้น) ฉันมักใช้ps -fu $USER... รับการps -fจัดรูปแบบผลลัพธ์ที่ค่อนข้างคล้ายกับps uการจัดรูปแบบ แต่ยังได้รับสิ่งที่ระบุผู้ใช้ ในกรณีที่คุณต้องการทั้งสองอย่างในเวลาเดียวกัน
lindes-hw

คำตอบ:


130

ไวยากรณ์ที่ถูกต้องซึ่งส่งกลับผลลัพธ์เดียวกันจะเป็น:

ps u

มีเหตุผลที่ดีว่าทำไมไวยากรณ์สมัยใหม่psจึงยุ่งเหยิง ในอดีตมีสองรุ่นที่เข้ากันไม่psได้ ตัวเลือกที่มีประชั้นนำได้รับการสืบทอดมาจากรุ่น AT & T psของระบบปฏิบัติการยูนิกซ์ ตัวเลือกที่ไม่มีเส้นประนำถูกสืบทอดมาจาก BSD รุ่นของpsลีนุกซ์รุ่นนั้นใช้กันโดยทั่วไปคือ GNU ซึ่งได้รวมตัวเลือกทั้งสองเข้าด้วยกัน, รวมทั้งเพิ่มตัวเลือกชุดของตัวเองที่เริ่มต้นด้วยเส้นประสองชั้นนำ.

ดังนั้นจึงps uเป็นสไตล์ BSD และps -u $USERเป็น AT & T-style ความจริงที่ว่า GNU psอนุญาตให้คุณเรียกใช้ps -uและนอกเหนือจากคำเตือนแล้วจะได้รับผลลัพธ์เช่นเดียวกับที่ps uแสดงให้เห็นว่า GNU กำลังพยายามทำให้ดีที่สุดในสถานการณ์ที่เลวร้าย


จริงๆแล้วไม่มีเหตุผลที่ดีสำหรับความยุ่งเหยิง มีหลายสิ่งที่ไม่ดีและการแบ่งขั้วที่อ้างว่า "GNU" และ "BSD" นั้นเป็นการเข้าใจผิดที่นำเสนอโดยหน้าคู่มือของ Linux ดูunix.stackexchange.com/a/511530/5132
JdeBP

84

psคำสั่งในอดีตมีไวยากรณ์ที่แตกต่างกันอย่างดุเดือดใน BSD และระบบวียูนิกซ์

  • ในBSDpsที่uตัวเลือก (ไม่มีขีด) ใช้เวลาพารามิเตอร์และไม่แสดงให้เห็นว่า "ผู้ใช้ที่มุ่งเน้นการส่งออก" กับคอลัมน์เพิ่มเติม

  • ในSunOSpsที่-uตัวเลือก (กับเส้นประ) ใช้เวลาชื่อผู้ใช้เป็นพารามิเตอร์และเพียง แต่มีกระบวนการที่เป็นเจ้าของโดยผู้ใช้นั้น แต่โดยไม่ต้องเปลี่ยนรูปแบบการแสดง

(เป็นอีกตัวอย่างที่พบบ่อยมาก BSD eหมายถึง "แสดงสภาพแวดล้อม" ในขณะที่ SunOS -eหมายถึง "แสดงกระบวนการของทุกคน")

Linux procps psพยายามสนับสนุนทั้งสองสไตล์ ดังนั้นหากคุณใช้ตัวเลือก 'เส้นประ' -uมันจะต้องเป็นตัวเลือก "กรองผู้ใช้รายนี้" ของ SunOS ไม่ใช่ตัวเลือกคอลัมน์เพิ่มเติม ทั้งสองสับสนบ่อยพอprocpsพยายามทำสิ่งที่คุณหมายถึง - หากชื่อผู้ใช้หายไปมันจะถือว่าคุณให้ตัวเลือก BSD แต่ใช้ไวยากรณ์ SunOS

(ในความเป็นจริงมีหลายสายพันธุ์psที่procpsมีตาราง "บุคลิกภาพ" จริง ๆ เพื่อบังคับพฤติกรรมที่คลุมเครือให้ตีความว่าเป็นรูปแบบหนึ่งหรืออีกรูปแบบหนึ่งหรืออย่างอื่นนอกเหนือจากลูกบิดเช่น "UNIX95", "CMD_ENV", "_XPG", "I_WANT_A_BROKEN_PS" ...


29
"I_WANT_A_BROKEN_PS" ฮ่า ๆ ๆ

42
... ตอนแรกฉันคิดว่ามันเป็นเรื่องตลก แต่ nooooo ...
Izkata

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