OS.Kill لا ترفع OSERROR، ومع ذلك، لا أرى PID قيد التشغيل
سؤال
على خادم Ubuntu الخاص بي، قمت بتشغيل الأمر التالي:
python -c 'import os; os.kill(5555, 0)'
يتم ذلك حتى أتمكن من معرفة ما إذا كان PID 5555 قيد التشغيل. من فهمي هذا يجب أن يرفع OSERROR إذا لم يتم تشغيل PID. هذا لا يرفع OSERROR بالنسبة لي مما يعني أنه يجب أن يكون عملية قيد التشغيل. ومع ذلك عندما أركض:
ps aux | grep 5555
لا أرى أي عملية تعمل مع تلك PID. يحدث هذا أيضا على العديد من البلاستيك الأخرى في هذا النطاق العام، لكنه لا يحدث مع القول 555 أو 55555.
هل لدى أي شخص أي نظرة ثاقبة حول سبب عدم تربية OS.Kill من المتوقع أن يزيد ذلك؟
ملاحظة: هذا يعمل تحت Python 2.5.1.
المحلول
تحت لينكس، كل عملية و كل مؤشر ترابط لديه pid مختلفة. os.kill
لا يهتم ما إذا كان لديك PID موضوع، أو PID مهمة، ولكن ps
لا تظهر عادة pids الموضوع.
على سبيل المثال، على جهازي، فإن عملية PID 8502 هي تشغيل مؤشرات الترابط التي يمكنك أن ترى مثل هذا
$ ls /proc/8502/task/
8502 8503 8504 8505 8506 8507 8511 8512 8514 8659
لاحظ أن 8503 لا يظهر في قائمة العملية
$ ps aux | grep [8]503
$
ومع ذلك باستخدام بعض أكثر ps
الحجج التي يمكنك رؤيتها
$ ps -eLf | grep [8]503
ncw 8502 1 8503 0 10 10:00 ? 00:00:00 /usr/lib/virtualbox/VBoxSVC --automate
(الآثار ل [8]503
يعني أن grep
لن تظهر - إنها خدعة يونكس القديمة!)
الآن دعونا نرى ما إذا كان على قيد الحياة أم لا
$ python
Python 2.6.4 (r264:75706, Nov 2 2009, 14:44:17)
[GCC 4.4.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
Loaded customisations from '/home/ncw/.pystartup'
>>> import os
>>> os.kill(8503, 0)
>>>
هذا يكرر مشكلتك.
أعتقد إذا قمت بذلك
ls /proc/*/task/5555
أو
ps -eLf | grep [5]555
سترى موضوع الجاني.
نصائح أخرى
حاول تثبيت HTOP (Sudo Apt-Get تثبيت HTOP)، فإنه يعرض في بعض الأحيان العملية التي لا.
ربما يكون خطأ في 2.5؟ في 2.6.4 أحصل على:
gruszczy@gruszczy-laptop:~$ python -c 'import os; os.kill(5555, 0)'
Traceback (most recent call last):
File "<string>", line 1, in <module>
OSError: [Errno 3] No such process
أعتقد، هناك تقرير خطأ لهذا:
http:/mail.python.org/pipmail/new-bugs-announce/2009-february/004222.html.
لا أعرف لماذا لا يتم رفع أوسفرور في بعض الحالات، ولكن من المهم أن نلاحظ وجود قيمة PID القصوى على نظام التشغيل Linux و UNIX:
$> cat /proc/sys/kernel/pid_max
32768