दिलचस्प पोस्ट
क्या करता है || ऑपरेटर करते हैं? क्या संकेतक का आकार डेटा और फ़ंक्शन पॉइंटर्स के बीच भिन्न हो सकता है? ब्राउज़र को "संवाद के रूप में सहेजते हैं" प्रदर्शित करने के लिए कैसे करें ताकि उपयोगकर्ता अपने सिस्टम पर फ़ाइल की स्ट्रिंग की सामग्री को सहेज सके? सी #: एक विरासत घटना में वृद्धि एक फ़ोल्डर संरचना के समान ब्लॉग पोस्ट लिंक बनाएं प्रत्येक DStream को स्थायी तालिका में कैसे सहेज / डालें कैसे div तत्व को धुंधला करने के लिए? क्या जावा रेगएक्स केस-असंवेदनशील है? एफ़टीपी / एसएफटीपी एक अमेज़ॅन एस 3 बाल्टी एक्सेस यदि onclick निष्पादित है मैं HREF कैसे अक्षम कर सकता हूँ? क्या रूबी में सिंगल कोट्स बनाम डबल कोट्स का उपयोग करने में कोई लाभ है? iPhone UIWebView स्थानीय संसाधनों का उपयोग कर जावास्क्रिप्ट और हैंडलिंग अनुदेषण बदलें उपयोगकर्ताओं को ऐप के अंदर से नवीनतम ऐप संस्करण की जांच करने की अनुमति कैसे दी जाती है? जावास्क्रिप्ट ऑब्जेक्ट में प्रॉपर्टी नाम के रूप में परिवर्तनीय शब्दशः? पूंछ के समान, अंत में शुरू होने वाली एक फ़ाइल से पढ़ें

पायथन में प्रभावी प्रक्रिया नाम बदलने का कोई तरीका है?

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

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

लेकिन पायथन में

 argv[0] = "othername" 

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

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

वेब के समाधान से एकत्रित समाधान "पायथन में प्रभावी प्रक्रिया नाम बदलने का कोई तरीका है?"

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

इसके अलावा, मैं विंडोज़ पर प्रोसेस नामों से तुम्हारा क्या मतलब है इस बारे में उलझन में हूँ

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

यदि हां, तो आपको टिम गोल्डन के WMI इंटरफ़ेस का उपयोग करने की आवश्यकता है और कॉल करें। सेवा पर बदलें विधि … कम से कम अपने ट्यूटोरियल के अनुसार।

लिनक्स के लिए मैंने इस खराब पैक मॉड्यूल को छोड़कर काम किया है, जो आपके लिए argv [0] सेट करता है।

मुझे यह भी पता नहीं है कि यह बीएसडी संस्करणों पर काम करेगा (जिसमें एक सेटप्रोक्टिटल सिस्टम कॉल है)। मुझे पूरा यकीन है कि argv [0] सोलारिस पर काम नहीं करेगा

मैंने हाल ही में एक पोर्टेबल तरीके से प्रक्रिया शीर्षक बदलने के लिए एक पायथन मॉड्यूल लिखा है: https://github.com/dvarrazzo/py-setproctitle जांचें

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

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

वास्तव में आपको लिनक्स पर 2 चीजों की ज़रूरत है: C ( ps auxf और दोस्तों के लिए) C से ps auxf argv[0] संशोधित करें और PR_SET_NAME ध्वज के साथ 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 नए नाम के साथ काम करेंगे।

btw, proccode googlecode से भी बदल जाता है argv[0] , इस प्रकार, यहां तक ​​कि ps auxf आउटपुट में परिवर्तन करता है

अद्यतनः इस उत्तर में पोस्ट किया गया समाधान फ्रीबैड पर कभी-कभी अच्छा नहीं खेलता है। मैं अब इस प्रश्न में विभिन्न लिनक्स और फ्रीब्सडी बक्से पर एक वर्ष के लिए पीई-सेटप्रोक्टिटल का उपयोग कर रहा हूं। अब तक कोई असफल नहीं है! सभी को भी चाहिए! :)। यह लगभग उसी कोड का उपयोग करता है जैसा कि पोस्टग्रेएसक्यूएल अपने मुख्य डेटाबेस और बाल प्रक्रियाओं में उपयोग करता है।

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

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

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

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

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

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

Setproctitle पैकेज पर एक नजर डालें

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

समान प्रश्न का मेरा जवाब डुप्लिकेट के रूप में चिह्नित किया गया है:

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

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

 #!/usr/bin/env python 

लेकिन यह आपके स्क्रिप्ट नाम के साथ नामित किया जाएगा:

 #!/usr/bin/python 

तो आप इसे pidof -x scriptname या ps -C scriptname

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

 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 

एकल '=' चिह्न को नोट करें