سؤال

كيف يمكنني الحصول على قائمة عملية بجميع العمليات الجارية من 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 على اسم العملية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top