سؤال كيفية التحقق من العملية قيد التشغيل بالفعل أم لا


أرغب في التحقق من العملية المعينة التي تعمل بالفعل أم لا.

أنا محكم هذا سؤال وجواب.

لكن لم أحصل على أي حل محدد. فيما يلي المثال الذي حاولت القيام به: لقد خلقت abc.sh ملف وتشغيل هذا البرنامج النصي على الخلفية ، مثل sh 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

هل هناك طريقة أخرى لإيجاد العملية قيد التشغيل أم لا؟


27
2018-05-29 11:21


الأصل




الأجوبة:


سيتم سرد كل عملية في إخراج ps aux. سواء الركض ، النوم ، الزومبي أو توقفت.

ومع ذلك ، في قضيتك ، حيث قمت بتشغيل العملية باستخدام sh abc.sh، sh هو تطبيق (shell) قيد التشغيل وليس abc.sh. بالتالي، ps aux لن يحتوي على العملية abc.sh لأن الذي grep لا يمكن أن تسفر عن أي نتيجة.

لذا ، الطريقة الصحيحة التي يجب أن تستخدمها هي كما يلي:

ps aux | grep sh

قد يعيدك هذا أيضًا عملية أخرى قيد التشغيل بعد السلسلة sh في أي مكان في إنتاجهم ps aux.

يجب عليك ملاحظة أن العملية ستكون "قيد التشغيل" عند إخراج ps aux يحتوي على STAT مثل R. إذا كان شيء آخر غير ذلك ، فهو لا يعمل على المثيل الذي أطلقت فيه الأمر لفحص العمليات الجارية. يمكن العثور على حالات العملية المختلفة في صفحة الرجل لـ 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

بحيث تعرف shell التطبيق المطلوب استخدامه لتشغيل البرنامج النصي (sh في هذه الحالة ، قم بتغييره إلى #!/bin/bash لـ bash) ، ثم تقديم أذونات قابلة للتنفيذ للعملية باستخدام:

chmod +x /path/to/abc.sh

استبدال /path/to/ مع موقع abc.sh الملف ثم قم بتشغيل abc.sh استخدام

/path/to/abc.sh

مرة أخرى استبدال /path/to/ مع موقع abc.sh ملف.


36
2018-05-29 11:53



سؤال واحد سريع. ما هو القانون S+ يعني - Prakash V Holkar
ولكن يمكنك العثور على الفرق بين تشغيل العمليات وعدم تشغيل العمليات من خلال إخراج ps aux | grep filename أمر. - Avinash Raj
TechGuru: هذا يعني أن العملية تنام في المقدمة ، يرجى الرجوع إلى صفحة الدليل الإرشادي لمزيد من المعلومات. - jobin
AvinashRaj: نعم ، بالطبع يمكنك ذلك. - jobin
أحصل على خطأ: خطأ ، قم بما يلي: mount -t proc proc / proc - Igor G.


مشكلتي مع grep هو أنه محلل كامل الخط. في المثال الخاص بك ، أنت تبحث عن "abc" ، ولكن ذلك يؤدي إلى التراجع عن مثيله grep (التي تبحث عن "abc"). قليلا التعميم. يمكنك تصفية ذلك ولكن أجد كل ذلك منحرف قليلا.

كنت اتجه الى awk لفترة صغيرة.

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

awk تقسيم الخطوط إلى حقول استناداً إلى مسافة بيضاء (افتراضياً). الحقول $ 11 + هي عمود (أوامر) الأمر حتى إذا كان الأمر "sh abc.sh ..." ، $11 سوف يكون sh و $12 سوف يكون abc.sh.

إذا كنت ترغب في التحكم في الإخراج أو السلسلة باستخدام Bash && و || لكن عليك أن تكون أكثر ذكاءً قليلاً. 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"}'

6
2018-05-29 20:13





الطريقة الصحيحة للتحقق في جلسة باش الحالية إذا بدأت عملية في الخلفية ، مثل sh abc.sh &، هو بالفعل قيد التشغيل أو لا يستخدم jobs أمر مدمج.

مثال:

$ 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 لمزيد من المعلومات.

ستعمل الطريقة المذكورة أعلاه فقط في الجلسة الحالية من bash. ولكن إذا كنت في جلسة أخرى باش (على سبيل المثال في نافذة طرفية أخرى أو علامة تبويب أخرى ، أو في نص برمجي) ، بخلاف ما يلي:

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

يمكنك أيضًا استخدام:

pgrep -a sh

الذي يبدو أكثر بساطة بالنسبة لي. إذا كنت سترى الأمر المكتوب في الإخراج (sh abc.sh في هذه الحالة) ، وهذا يعني أن العملية لا تزال قيد التشغيل. إذا لم يكن كذلك ، فقد انتهت العملية.


4
2018-05-29 17:52





إذا كان النص البرمجي قيد التشغيل حاليًا ، فيجب إظهاره بواسطة 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 الأمر ، سيتم عرضه على الإخراج. لأن البرنامج النصي قيد التشغيل حاليًا.


3
2018-05-29 11:33





إذا كنت ترغب ببساطة في التحقق مما إذا كانت هناك أي عملية قيد التشغيل ، فانتقل إلى هذا الدليل واكتب ll -tr إذا رأيت .csv أو .work إلخ في نهاية الملف ، فهذا يعني أنه ليس تحت العملية الأخرى.


0
2018-05-23 20:16





  • إذا كنت تريد التحقق من جميع العمليات ، فاستخدم "top"

  • إذا كنت تريد أن تعرف العمليات التي تديرها جافا ثم استخدامها ps -ef | grep java

  • إذا كانت العملية الأخرى ثم استخدم فقط ps -ef | grep xyz أو ببساطة /etc/init.d xyz status

  • إذا كان من خلال أي رمز مثل .sh ثم ./xyz.sh status


-1
2018-05-23 19:55



-1 بينما تكون هذه الأوامر مفيدة في بعض الظروف ، فإنها ستظل غير مجدية لشخص لا يعرف هذه الظروف. في كل حالة ، إما أنك لا تشرحها بما يكفي أو أن تفسيرك خاطئ. - David Foerster