2015-04-20 9 views
7

मेरे पास अपाचे HTTPD के पीछे एक फ्लास्क ऐप चल रहा है। अपाचे को कई बाल प्रक्रियाओं के लिए कॉन्फ़िगर किया गया है।अपाचे फ़्लास्क प्रक्रिया को समाप्त करते समय फ़ंक्शन को कैसे कॉल करें?

फ्लास्क ऐप सर्वर पर फ़ाइल को फ़ाइल की नाम के साथ अपनी प्रक्रिया आईडी के बराबर फ़ाइल बनाता है। कोड इस तरह दिखता है:

import os 

@app.before_first_request 
def before_first_request(): 
    filename = os.getpid() 
    with open(filename, 'w') as file: 
     file.write('Hello') 

जब बच्चा प्रक्रिया मार दिया जाता है/समाप्त हो गया/समाप्त मैं इस फ़ाइल को हटाने के लिए बोतल एप्लिकेशन चाहते हैं।

यह बहुत महत्वपूर्ण नहीं है कि फ़ाइल को हटाने का कारण होता है, क्योंकि इन फ़ाइलों में अधिक जगह नहीं लगेगी, इसलिए अगर विचित्र त्रुटियां होती हैं तो मुझे उन्हें संभालने की आवश्यकता नहीं होती है। लेकिन सामान्य वर्कफ़्लो के लिए, जब आप अपाचे फ्लास्क प्रक्रिया को बंद कर देते हैं तो मैं कुछ सफाई करना चाहता हूं।

ऐसा करने का सबसे अच्छा तरीका कोई विचार?

उत्तर

6

सर्वर-नियंत्रित पाइथन प्रक्रिया (जैसे अपाचे डब्लूएसजीआई संदर्भ में चल रहे फ्लास्क ऐप, या अपाचे के पीछे गनिकॉर्न में भी बेहतर) से पहले सफाई कार्यक्षमता जोड़ने से सबसे अच्छा तरीका atexit निकास हैंडलर का उपयोग कर रहा है।

अपने मूल उदाहरण पर विस्तार से चर्चा करते यहाँ .pid फ़ाइल की सफाई कर बाहर निकलने के संचालक के अलावा है:,

import atexit 
import os 

filename = '{}.pid'.format(os.getpid()) 

@app.before_first_request 
def before_first_request(): 
    with open(filename, 'w') as file: 
     file.write('Hello') 

def cleanup(): 
    try: 
     os.remove(filename) 
    except Exception: 
     pass 

atexit.register(cleanup) 
+1

अपाचे/mod_wsgi निश्चित रूप से हमेशा यह सुनिश्चित करें कि atexit कॉलबैक लागू कर रहे हैं की कोशिश करता है यहां तक ​​कि ऐसे मामलों में जहां प्रक्रिया अनुरोध टाइमआउट इत्यादि जैसी स्थितियों के कारण बंद होना पड़ रहा है। बंदूकधारी में गारंटी की गारंटी नहीं है और आपको बंदूक के तहत अटेक्सिट का उपयोग करने के बारे में और अधिक सावधान रहना होगा क्योंकि इसे विभिन्न मामलों में नहीं कहा जाएगा। किसी भी मामले में आपको उस पर भरोसा नहीं करना चाहिए और यदि आवेदन मौजूद नहीं होना चाहिए तो किसी भी आवेदन को बाद में चलाने वाली फ़ाइल के लिए लचीला होना चाहिए। इसे हटाने के लिए एक अलग कार्य अन्य उत्तर वर्णन के रूप में आवश्यक हो सकता है। –

+0

कुछ अन्य डब्लूएसजीआई सर्वरों के लिए कॉलबैक पर भी कॉल नहीं किया जा सकता है। मेरा मानना ​​है कि यह अभी भी यूडब्ल्यूएसजीआई के मामले में है जब तक कि आप इसे एक दुभाषिया का उपयोग करने के लिए मजबूर नहीं करते हैं, क्योंकि यह सुनिश्चित करने के लिए कदम नहीं उठाता है कि उप-दुभाषियों में अयोग्य कॉलबैक को बुलाया जाता है। इसे विशेष कदम उठाने होंगे क्योंकि पाइथन उप दुभाषियों में अनावश्यक कॉलबैक नहीं कहता है और अपाचे/mod_wsgi यह सुनिश्चित करने के लिए विशेष चाल का उपयोग कर रहा है। –

+0

महान जानकारी @GrahamDumpleton! इसके लिए धन्यवाद, और 'os.remove'' कॉल के आस-पास अपवाद गार्ड। –

2

अपाचे प्रक्रिया के बाहर इसे संभालने का सबसे आसान तरीका होगा। इस बात की कोई गारंटी नहीं है कि प्रक्रिया हमेशा फ़ाइलों को हटा देगी (उदाहरण के लिए, यदि आप अपाचे सर्वर मध्य अनुरोध को पुनरारंभ करते हैं)।

अतीत में मैंने जो दृष्टिकोण लिया है वह cron का उपयोग करना है। अपने भंडार में कहीं एक छोटी लिपि लिखें और इसे एक शेड्यूल (दैनिक आमतौर पर काम करता है) पर निष्पादित किया जाता है। यह स्क्रिप्ट 24 घंटे से अधिक पुरानी डायरेक्टोरिटी में सभी फाइलों को साफ़ कर सकती है, इसलिए आपके पास हमेशा 1 दिन की फाइलों की रोलिंग विंडो होगी।

यह दो लाभ हैं:

  1. आप स्क्रिप्ट के कुल नियंत्रण में हैं, और आप चाहते हैं किसी भी भाषा का उपयोग कर सकते हैं।
  2. आप इन फ़ाइलों के साथ फैंसी सामान कर सकते हैं। आप उन्हें संपीड़ित कर सकते हैं और उन्हें कहीं और स्टोर कर सकते हैं, उन्हें हटा सकते हैं, या उन पर विश्लेषण कर सकते हैं। पूरी तरह से आप तक!

अधिकांश स्क्रिप्टिंग भाषाओं में एक छोटा रैपर वर्ग होता है जिसका उपयोग cron को और अधिक अनुकूल बनाने के लिए किया जा सकता है। रूबी के लिए एक लोकप्रिय एक whenever है।

संबंधित मुद्दे