سؤال هل "ps -u" حقاً بنية سيئة؟


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

75
2017-10-14 06:49


الأصل


إلقاء الضوء على الإجابات. شكرا على السؤال! - Frank Thomas
والآن بالنسبة للجزء الصعب: ما هي الإجابة التي يجب أن تحصل على علامة الاختيار؟ - sjngm
في الواقع اعتقدت أنني يجب أن تسمح لك ، المستخدمين ، يقرر. يجب على الشخص الذي لديه أعلى الارتفاعات أن يحصل عليه. لكن ، أنت لا تجعل هذا أسهل ؛) - sjngm
عندما تكون كلا الإجابتين جيدة على حد سواء ، فإنني أحفظ كلاهما ، وأعطي علامة الاختيار للمستخدم مع مندوب أقل ، خاصة عندما يكون الفرق أكثر من 100k. - Frank Thomas
ردًا علىFrankThomas: - sjngm


الأجوبة:


الصيغة الصحيحة ، الذي يعيد نفس الإخراج، سيكون:

ps u

هناك سبب وجيه لماذا بناء الجملة الحديثة ل ps في حالة من الفوضى. تاريخيا ، كان هناك إصداران غير متوافق من ps. تم توريث الخيارات مع شرطة رائدة من إصدار AT & T Unix من ps. تم توريث خيارات بدون شرطة رائدة من BSD. نسخة من ps التي تستخدمها توزيعات لينكس بشكل عام هي GNU التي دمجت كلا المجموعتين من الخيارات معًا ، بالإضافة إلى إضافة مجموعة الخيارات الخاصة بها التي تبدأ بـ شرطة مزدوجة.

وهكذا، ps u هو نمط BSD و ps -u $USER هو نمط AT & T. حقيقة أن جنو ps يسمح لك بتشغيل ps -u و ، بخلاف التحذير ، الحصول على نفس الإخراج كـ ps u يظهر أن غنو يحاول أن يحقق أفضل وضع سيء.


130
2017-10-14 06:54





ال ps كان للأمر تاريخيا بناء جملة مختلفة بشكل هائل في BSD و System V Unix.

  • في BSD ps، ال u لا يأخذ أي خيار (بدون شرطة) أي معلمة ويعرض "الإخراج الموجه نحو المستخدم" مع الأعمدة الإضافية.

  • في صن أو. إس ps، ال -u الخيار (مع الشرطة) يأخذ اسم المستخدم كمعلمة ويتضمن فقط العمليات التي يملكها هذا المستخدم ، ولكن دون تغيير تنسيق العرض.

(كمثال شائع آخر ، BSD e يعني "إظهار البيئة" ، في حين SunOS -e تعني "عرض عمليات الجميع".

لينكس procps  ps يحاول دعم كلا الأنماط. لذلك إذا كنت تستخدم خيار "الشرطة" -u، فإنه يتوقع أن يكون خيار "تصفية هذا المستخدم" في SunOS ، ليس خيار الأعمدة الممتدة. وهما الخلط مرارا وتكرارا بما فيه الكفاية ، ومع ذلك ، ذلك procps يحاول أن يفعل ما تقصده - إذا كان اسم المستخدم مفقودًا ، فسوف يفترض أنه أعطاك خيار BSD ولكن استخدم بناء جملة SunOS.

(كان هناك في الواقع العديد من المتغيرات المختلفة لل ps هذا procps يحتوي على جدول حقيقي من "الشخصيات" لفرض سلوك غامض ليتم تفسيره على أنه نمط واحد أو آخر أو آخر - بالإضافة إلى المقابض مثل "UNIX95" و "CMD_ENV" و "_XPG" و "I_WANT_A_BROKEN_PS" ...)


84
2017-10-14 07:04



"I_WANT_A_BROKEN_PS" ههه.
... في البداية ، اعتقدت أنه كان مزحة. لكن لاوو ... - Izkata
هم ، كما تبين ، هذا هو الخيار الصحيح لإخفاء "الاستخدام الغامض" للتحذيرات التي يشاهدها OP. - grawity