هل هناك طريقة لتغيير اسم العملية الفعالة في بيثون؟

StackOverflow https://stackoverflow.com/questions/564695

سؤال

هل يمكنني تغيير اسم العملية الفعالة لبرنامج نصي بيثون؟ أريد إظهار اسم مختلف بدلا من الاسم الحقيقي للعملية عندما أحصل على قائمة عملية النظام. في 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

لاحظ علامة واحدة "="

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