هل هناك طريقة لتغيير اسم العملية الفعالة في بيثون؟
سؤال
هل يمكنني تغيير اسم العملية الفعالة لبرنامج نصي بيثون؟ أريد إظهار اسم مختلف بدلا من الاسم الحقيقي للعملية عندما أحصل على قائمة عملية النظام. في CI يمكن تعيين
strcpy(argv[0],"othername");
ولكن في بيثون
argv[0] = "othername"
لا يبدو أن العمل. عندما أحصل على قائمة العملية (مع ps ax
في صندوق Linux الخاص بي) لا يتغير الاسم الحقيقي. أفضل حل محمول (أو حل آخر واحد لبيئات Posix وبيئات Windows أخرى)، إذا كان موجودا.
شكرا مقدما
المحلول
ببساطة وضعت، لا توجد طريقة محمولة. سيكون عليك اختبار النظام واستخدام الطريقة المفضلة لهذا النظام.
علاوة على ذلك، أنا مرتبك حول ما تقصده بأسماء المعالجة على Windows.
هل تقصد اسم الخدمة؟ أفترض ذلك، لأنه لا يوجد شيء آخر يجعل أي معنى حقا (على الأقل إلى غير Windows باستخدام الدماغ).
إذا كان الأمر كذلك، فأنت بحاجة إلى استخدام تيم الذهبي واجهة WMI واتصل بطريقة .change في الخدمة ... على الأقل وفقا له الدورة التعليمية.
لنظام Linux، أي من الطرق التي وجدتها عملت باستثناء هذه الوحدة المعبأة سيئة التي تحدد argv [0] بالنسبة لك.
لا أعرف حتى إذا كان هذا سيعمل على متغيرات BSD (التي تحتوي على مكالمة نظام SetProctitle). أنا متأكد من أن Argv [0] لن يعمل على سولاريس.
نصائح أخرى
لقد كتبت مؤخرا وحدة بيثون لتغيير عنوان العملية بطريقة محمولة: تحقق https://github.com/dvarrazzo/py-setproctitle.
إنه مجمع حول الرمز المستخدم بواسطة postgresql لإجراء تغيير العنوان. يتم اختباره حاليا مقابل Linux و Mac OS X: Windows (مع وظائف محدودة) وخدمة BSD في الطريق.
يحرر: اعتبارا من يوليو 2010، تعمل الوحدة النمطية مع BSD ومع وظيفة محدودة على Windows، وقد تم نقلها إلى Python 3.x.
في الواقع تحتاج إلى 2 أشياء في Linux: تعديل argv[0]
من C
(بالنسبة ps auxf
والأصدقاء) والاتصال prctl
مع PR_SET_NAME
علم.
لا توجد وسيلة على الإطلاق للقيام بالقطعة الأولى من بيثون نفسها. على الرغم من أنه يمكنك فقط تغيير اسم العملية عن طريق الاتصال PRCTL.
def set_proc_name(newname):
from ctypes import cdll, byref, create_string_buffer
libc = cdll.LoadLibrary('libc.so.6')
buff = create_string_buffer(len(newname)+1)
buff.value = newname
libc.prctl(15, byref(buff), 0, 0, 0)
def get_proc_name():
from ctypes import cdll, byref, create_string_buffer
libc = cdll.LoadLibrary('libc.so.6')
buff = create_string_buffer(128)
# 16 == PR_GET_NAME from <linux/prctl.h>
libc.prctl(16, byref(buff), 0, 0, 0)
return buff.value
import sys
# sys.argv[0] == 'python'
# outputs 'python'
get_proc_name()
set_proc_name('testing yeah')
# outputs 'testing yeah'
get_proc_name()
ps auxf
سوف تظهر فقط "بيثون" بعد ذلك :(. لكن top
و ps -A
سوف تظهر "اختبار نعم" جديد الاسم :). أيضا killall
و pkill
سوف تعمل مع اسم جديد.
راجع للشغل، procname من googlecode أيضا يتغير argv[0]
, وبالتالي، حتى التغييرات ps auxf
انتاج.
تحديث: الحل المنشور في هذه الإجابة لا يلعب لطيفا في بعض الأحيان على FreeBSD. أنا الآن أستخدم Py-setproctitle. معلن في هذه الإجابة لمدة عام أو نحو ذلك على العديد من صناديق لينكس وغرة. لا فشل حتى الآن! الجميع يجب أيضا! :). يستخدم تقريبا نفس الكود كما postgresql. الاستخدامات في قاعدة البيانات الرئيسية والعمليات الرئيسية.
إلقاء نظرة على setproctitle. صفقة
هذه نسخة محمولة تماما ويعمل على العديد من المنصات.
أولا، لست متأكدا من أن مجرد إعدادات argv[0]
في برنامج C يغير الاسم الموضح في ps
. وبعد ربما يفعل في بعض Unixen، لكن فهمي هو أنه ليس من المتوقع أن.
ثانيا، نظرا لأن Windows متوافق مع بوسيكس على وجه التحديد، إلا أن بعض الأشياء فقط هي "محمولة" بين posix وغير بوسيكس. نظرا لأنك تقول على وجه التحديد "PS"، سأفترض أن Posix هو أولويتك وقد لا يعمل Windows.
الأهم من ذلك، فهمي للتغيير argv[0]
هو أنه يتطلب دعوة إلى exec
لجعل هذه التغييرات. على وجه التحديد، exec
استدعاء لديه طريق إلى ملف قابل للتنفيذ وفصل argv
قائمة. جعل دعوتك الخاصة تتيح لك كسر اتفاقية Shell لوضع الاسم القابل للتنفيذ في argv[0]
.
لديك إدارة عملية مكتبة OS الذي يمنحك الوصول المباشر إلى مكتبة نظام التشغيل للقيام بذلك. يجب عليك التفكير في كسر البرنامج النصي إلى قسمين - بداية "العمل الحقيقي". ينشئ المبتدئ البيئة وقت التشغيل والإدمان العمل الحقيقي مع المعلمات المرغوبة.
في C، كنت تستبدل عمليةك الخاصة مع آخر. في بيثون، فأنت تحل محل مترجم الثعبان القديم مع جديد يحتوي على Argv مختلفة [0]. نأمل أن ذلك لن تقع في هذا. بعض البرامج تحقق Argv [0] لتحديد ما يفعلونه.
انت ايضا تملك subprocess.popen. أنه يمكنك استخدامها لتعيين Args المطلوب والتنفيذ. ومع ذلك، في هذه الحالة، يجب أن تكون العملية الأصل قائمة لجمع الطفل عند انتهاء الطفل. قد لا يفعل الوالد أي شيء أكثر من Popen.wait
إجابتي على سؤال مماثل ملحوظ مكرر:
هناك بساطة (لا تحتاج إلى استيراد أي libs) ولكن ربما ليست وسيلة أنيقة جدا. يجب أن لا تستخدم "ENV" داخل خط Shebang.
وبعبارة أخرى، سيتم تسمية هذا باسم "Python" في قائمة العملية:
#!/usr/bin/env python
ولكن سيتم تسمية هذا مع ScriptName الخاص بك:
#!/usr/bin/python
لذلك سوف تكون قادرا على العثور عليه بشيء مثل pidof -x scriptname
أو ps -C scriptname
لقد وجدت بيثون PRCTL. للعمل بشكل جيد للغاية تحت لينكس. سيتعين عليك العثور على شيء آخر لنظام التشغيل Windows.
In [1]: import sys
In [2]: print sys.argv[0]
C:\Python25\scripts\ipython.py
In [3]: sys.argv[0] = 'foo'
In [4]: print sys.argv[0]
foo
لاحظ علامة واحدة "="