2009-02-19 21 views
58

क्या मैं पाइथन लिपि के प्रभावी प्रक्रिया नाम को बदल सकता हूं? जब मैं सिस्टम प्रक्रिया सूची प्राप्त करता हूं तो मैं प्रक्रिया के वास्तविक नाम के बजाय एक अलग नाम दिखाना चाहता हूं। सी में मैंक्या Python में प्रभावी प्रक्रिया नाम बदलने का कोई तरीका है?

strcpy(argv[0],"othername"); 

सेट कर सकते हैं लेकिन अजगर

argv[0] = "othername" 

में काम करने के लिए प्रतीत नहीं होता। जब मुझे प्रक्रिया सूची मिलती है (मेरे लिनक्स बॉक्स में ps ax के साथ) वास्तविक नाम नहीं बदलता है। मैं एक पोर्टेबल समाधान (यानी पॉज़िक्स के लिए एक समाधान और विंडोज वातावरण के लिए एक और विकल्प) पसंद करता हूं, यदि यह मौजूद है।

अग्रिम धन्यवाद

+0

जैसे कुछ के साथ इसे ढूंढें https://superuser.com/questions/427642/is-it-possible-to-set-the-process-name-with-pythonw, जहां http: // bugs.python.org/issue5672 मुझे है ntionned – anarcat

उत्तर

10

से कुछ भी नहीं कर रहे हैं, बस कोई पोर्टेबल तरीका नहीं है। आपको सिस्टम के लिए परीक्षण करना होगा और उस सिस्टम के लिए पसंदीदा विधि का उपयोग करना होगा।

आगे, मैं विंडोज़ पर प्रक्रिया नामों के बारे में उलझन में हूं।

क्या आपका मतलब सेवा का नाम है? मुझे ऐसा लगता है, क्योंकि कुछ भी वास्तव में कोई समझ नहीं आता है (कम से कम मेरे गैर-विंडोज़ के लिए मस्तिष्क का उपयोग कर)।

यदि ऐसा है, तो आपको Tim Golden's WMI interface का उपयोग करने की आवश्यकता है और सेवा पर श्रेणी विधि को कॉल करें ... कम से कम उसके tutorial के अनुसार।

तरीकों मैं this poorly packaged module के लिए छोड़कर काम किया पाया की लिनक्स कोई भी के लिए

है कि आप के लिए argv [0] तय करता है।

मुझे यह भी नहीं पता कि यह बीएसडी वेरिएंट पर काम करेगा (जिसमें एक सेटप्रोक्टीटल सिस्टम कॉल है)। मुझे यकीन है कि argv [0] Solaris पर काम नहीं करेगा। C से argv[0] (ps auxf और दोस्तों के लिए) को संशोधित करने और PR_SET_NAME ध्वज के साथ prctl फोन:

+0

मुझे पता है कि यह देर हो चुकी है, लेकिन नए पाठकों के लिए, @MattWritesCode [answer] (http://stackoverflow.com/a/13267122/248390) पर विचार करें, लिनक्स पर सीपीथॉन के लिए त्वरित और सरल। – bufh

-8
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 

नोट एक '=' पर हस्ताक्षर

+2

लेकिन अगर मैं ps (linux बॉक्स में प्रक्रिया सूची) चलाता हूं तो प्रक्रिया का नाम बिल्कुल वही रहता है। – Emilio

+1

आज़माएं, इसलिए, मेरे उत्तर को कम करने के बजाय - इस प्रश्न को अपने प्रश्न में स्पष्ट करने का प्रयास करें। ... –

+2

यह प्रक्रिया का नाम बिल्कुल नहीं बदलता है। यह केवल पायथन की argv की प्रति बदलता है। मैं इस स्पष्ट गलत जवाब को हटाने की सिफारिश करता हूं। – Dakkaron

4

सबसे पहले, मुझे यकीन है कि बस एक सी कार्यक्रम में argv[0] सेटिंग्स portably नाम ps में दिखाया गया है में परिवर्तन नहीं कर रहा हूँ। शायद यह कुछ यूनिक्स में करता है, लेकिन मेरी समझ यह है कि इसकी उम्मीद नहीं है।

दूसरा, चूंकि विंडोज विशेष रूप से गैर-पॉज़िक्स अनुपालन है, केवल कुछ चीजें पॉज़िक्स और गैर-पॉज़िक्स के बीच "पोर्टेबल" हैं। चूंकि आप विशेष रूप से 'ps' कहते हैं, मुझे लगता है कि POSIX आपकी प्राथमिकता है और Windows काम नहीं कर सकता है।

अधिक महत्वपूर्ण बात यह है कि argv[0] बदलने की मेरी समझ यह है कि इन परिवर्तनों को करने के लिए exec पर कॉल की आवश्यकता है। विशेष रूप से, exec कॉल में निष्पादन योग्य और अलग argv सूची दोनों का पथ होता है। अपना स्वयं का कॉल करने से आप argv[0] में निष्पादन योग्य नाम डालने के शेल सम्मेलन को तोड़ने की अनुमति देते हैं।

आपके पास OS library process management है जो आपको ऐसा करने के लिए ओएस लाइब्रेरी तक सीधे पहुंच प्रदान करता है। आपको अपनी स्क्रिप्ट को दो हिस्सों में तोड़ने पर विचार करना चाहिए - स्टार्टर और "असली काम"। स्टार्टर रन-टाइम पर्यावरण स्थापित करता है और वांछित पैरामीटर के साथ निष्पादन वास्तविक काम करता है।

सी में, आप अपनी प्रक्रिया को दूसरे के साथ बदल रहे हैं। पायथन में, आप पुराने पायथन दुभाषिया को एक नए के साथ बदल रहे हैं जिसमें एक अलग argv [0] है। उम्मीद है कि यह इस पर झुका नहीं होगा। कुछ कार्यक्रम यह तय करने के लिए argv [0] की जांच करते हैं कि वे क्या कर रहे हैं।

आपके पास subprocess.popen भी है जो आप अपने वांछित तर्क और निष्पादन योग्य सेट करने के लिए उपयोग कर सकते हैं। इस मामले में, हालांकि, जब बच्चे को खत्म होता है तो माता-पिता को बच्चे को इकट्ठा करने के लिए चारों ओर घूमना चाहिए। माता-पिता Popen.wait

+1

नहीं, लिनक्स में तर्क बदल रहा है (और संभवतः अन्य यूनिक्स, लेकिन सभी नहीं) तुरंत दृश्य प्रक्रिया नाम बदलता है, जिसका उपयोग कई व्यापक रूप से उपयोग किए जाने वाले कार्यक्रमों द्वारा उनकी प्रक्रियाओं के लिए वर्णनात्मक नाम देने के लिए किया जाता है: दोनों एसएसएच और पोस्टग्रेस ऐसा करते हैं, और कुछ अपनी वर्तमान स्थिति को इंगित करने के लिए फ्लाई पर सक्रिय रूप से अपना नाम बदलते हैं। Py_GetArgcArgv API कॉल का उपयोग करके, इसे करने के लिए एक पायथन मॉड्यूल लिखा जा सकता है। –

45

वास्तव में आप लिनक्स पर 2 बातें की जरूरत है।

इसमें अजगर से ही पहले टुकड़ा करने के लिए कोई रास्ता नहीं है। हालांकि, आप 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 नए नाम के साथ काम करेंगे।

बीटीडब्ल्यू, googlecode से procname भी argv[0] बदलता है, इस प्रकार, ps auxf आउटपुट भी बदलता है।

अद्यतन: इस उत्तर में पोस्ट किया गया समाधान फ्रीबीएसडी पर कभी-कभी अच्छा नहीं खेलता है। अब मैं py-setproctitle का उपयोग कर रहा हूं in this answer एक वर्ष या उससे अधिक विभिन्न लिनक्स और फ्रीब्स बॉक्स पर। अब तक कोई असफल नहीं है! सबको भी चाहिए! :)। यह PostgreSQLuses इसकी मुख्य डेटाबेस और बच्चे की प्रक्रिया में के रूप में लगभग एक ही कोड का उपयोग करता है। जाँच https://github.com/dvarrazzo/py-setproctitle

यह PostgreSQL द्वारा प्रयोग किया जाता शीर्षक परिवर्तन प्रदर्शन करने के लिए कोड के चारों ओर एक आवरण है:

+0

procname PyPy पर काम नहीं करता है (केवल सीपीथन पर) को सेटप्रोक्टाइटल का उपयोग करना होगा। – radtek

67

मैं हाल ही में एक पोर्टेबल तरह से प्रक्रिया शीर्षक बदलने के लिए एक पायथन मॉड्यूल लिखा है। यह वर्तमान में लिनक्स और मैक ओएस एक्स के खिलाफ परीक्षण किया जाता है: विंडोज (सीमित कार्यक्षमता के साथ) और बीएसडी portings रास्ते पर हैं।

संपादित करें: जुलाई 2010 तक, मॉड्यूल बीएसडी के साथ काम करता है और विंडोज़ पर सीमित कार्यक्षमता के साथ काम करता है, और इसे पायथन 3.x पर भेज दिया गया है।

+0

विंडोज़ पर स्थापित नहीं हो सकता है। – user

+0

@user कभी नहीं दिमाग: यह विंडोज़ पर बहुत उपयोगी नहीं है लेकिन इसके बारे में बहुत कुछ नहीं है। – piro

+0

क्या ps -f द्वारा प्रदर्शित तर्कों को बदलने का कोई तरीका है? मुझे वास्तव में प्रोग्राम नाम (हमेशा पायथन) की परवाह नहीं है, लेकिन मैं प्रदर्शित तर्कों को बदलना चाहता हूं। – KillianDS

5

setproctitle पैकेज

यह काफी एक पोर्टेबल संस्करण है और कई प्लेटफार्मों पर काम करता है पर एक नज़र डालें।

0

मैं लिनक्स के तहत बहुत अच्छी तरह से काम करने के लिए python-prctl मिल गया है। आपको विंडोज के लिए कुछ और ढूंढना होगा।

2

समान प्रश्न duplicate के रूप में चिह्नित करने के लिए मेरा जवाब:

वहाँ सरल है (यदि आप आयात किसी भी libs जरूरत नहीं है) लेकिन शायद इतना सुंदर नहीं जिस तरह से। आपको शेबांग लाइन के अंदर "env" का उपयोग नहीं करना है।

दूसरे शब्दों में, यह "अजगर" प्रक्रिया सूची में के रूप में नामित किया जाएगा:

#!/usr/bin/env python 

लेकिन यह अपने SCRIPTNAME स्क्रिप्ट के साथ नाम दिया जाएगा:

#!/usr/bin/python 

तो तुम कर सकेंगे pidof -x scriptname या ps -C scriptname