كيف يمكنني الحصول على قائمة العملية في بيثون؟
-
11-09-2019 - |
سؤال
كيف يمكنني الحصول على قائمة عملية بجميع العمليات الجارية من Python، على UNIX، تحتوي على اسم الأمر أو معرف العملية ومعرف العملية، لذلك يمكنني تصفية العمليات وقتلها.
المحلول
على لينكس، ربما يكون الحل الأسهل هو استخدام الخارجية ps
أمر:
>>> import os
>>> data = [(int(p), c) for p, c in [x.rstrip('\n').split(' ', 1) \
... for x in os.popen('ps h -eo pid:1,command')]]
على الأنظمة الأخرى، قد تضطر إلى تغيير الخيارات ps
.
لا يزال، قد ترغب في تشغيل man
على pgrep
و pkill
.
نصائح أخرى
على لينكس، مع بيثون مؤخرا بشكل مناسب الذي يشمل subprocess
وحدة:
from subprocess import Popen, PIPE
process = Popen(['ps', '-eo' ,'pid,args'], stdout=PIPE, stderr=PIPE)
stdout, notused = process.communicate()
for line in stdout.splitlines():
pid, cmdline = line.split(' ', 1)
#Do whatever filtering and processing is needed
قد تحتاج إلى تعديل الأمر PS وفقا لاحتياجاتك الدقيقة.
الحل المحمول المناسب في Python يستخدم PSUTIL.. وبعد لديك واجهات برمجة التطبيقات المختلفة للتفاعل مع PIDs:
>>> import psutil
>>> psutil.pids()
[1, 2, 3, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15, 17, 18, 19, ..., 32498]
>>> psutil.pid_exists(32498)
True
>>> p = psutil.Process(32498)
>>> p.name()
'python'
>>> p.cmdline()
['python', 'script.py']
>>> p.terminate()
>>> p.wait()
... وإذا كنت تريد "البحث والقتل":
for p in psutil.process_iter():
if 'nginx' in p.name() or 'nginx' in ' '.join(p.cmdline()):
p.terminate()
p.wait()
لماذا بيثون؟
يمكنك استخدام مباشرة killall
على اسم العملية.
لا تنتمي إلى StackOverflow