2011-01-09 19 views
26

मैं उत्सुक था कि आप पृष्ठभूमि में एक पायथन स्क्रिप्ट कैसे चला सकते हैं, हर 60 सेकंड में एक कार्य दोहराते हैं। मुझे पता है कि आप & का उपयोग कर पृष्ठभूमि में कुछ डाल सकते हैं, क्या यह इस मामले के लिए प्रभावशाली है?कुशल पायथन डेमॉन

मैं एक लूप करने के बारे में सोच रहा था, यह 60 के इंतजार कर रहा था और इसे फिर से लोड कर रहा था, लेकिन इसके बारे में कुछ महसूस होता है।

+1

यह निर्भर करता है कि आप क्या चाहते हैं। यदि आप हर बार दोहराने के लिए एक कार्य निर्धारित करना चाहते हैं, तो क्रॉन पर एक नज़र डालें। – Falmarri

उत्तर

7

मुझे लगता है कि आपका विचार बिल्कुल वही है जो आप चाहते हैं। उदाहरण के लिए:

import time 

def do_something(): 
    with open("/tmp/current_time.txt", "w") as f: 
     f.write("The time is now " + time.ctime()) 

def run(): 
    while True: 
     time.sleep(60) 
     do_something() 

if __name__ == "__main__": 
    run() 

time.sleep(60) करने के लिए कॉल 60 सेकंड के लिए सोने के लिए अपने कार्यक्रम डाल देंगे। जब वह समय बढ़ता है, तो ओएस आपके प्रोग्राम को जगाएगा और do_something() फ़ंक्शन चलाएगा, फिर उसे वापस सोएगा। जबकि आपका कार्यक्रम सो रहा है, यह कुछ भी कुशलतापूर्वक नहीं कर रहा है। पृष्ठभूमि सेवाओं को लिखने के लिए यह एक सामान्य पैटर्न है।

वास्तव में कमांड लाइन से इस चलाने के लिए आपको & उपयोग कर सकते हैं:

$ python background_test.py & 

जब ऐसा कर रही है, स्क्रिप्ट से किसी भी उत्पादन एक आप से यह शुरू कर दिया के रूप में एक ही टर्मिनल के लिए जाना जाएगा। आप उत्पादन अनुप्रेषित इस से बचने के लिए कर सकते हैं:

$ python background_test.py >stdout.txt 2>stderr.txt & 
+0

धन्यवाद आदमी, यह वही है जो मैं ढूंढ रहा था। प्रोग्रामिंग के बिट्स और टुकड़े मुझे पता है जावास्क्रिप्ट से आते हैं और एक टाइमर पर कुछ भी करने की कोशिश कर रहे हैं, एक दुःस्वप्न में बदल गया! –

+1

आप नोहुप (उदाहरण के लिए 'नोहप पायथन पृष्ठभूमि_टेस्ट.py') को भी देखना चाहते हैं कि आप लॉग आउट करने के बाद डिमन को चलाना चाहते हैं) – Foon

+1

' पायथन-डेमन 'का उपयोग करके ऐसा करने का एक आसान तरीका है जो कि है "मानक डेमॉन प्रक्रिया लाइब्रेरी": http://stackoverflow.com/a/8375012/462302 – aculich

5

खोल में & का प्रयोग शायद मृत सबसे आसान तरीका के रूप में ग्रेग वर्णित है।

यदि आप वास्तव में एक शक्तिशाली डेमॉन बनाना चाहते हैं, तो आपको os.fork() कमांड को देखना होगा।

उदाहरण Wikipedia से:

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

import os, time 

def createDaemon(): 
    """ 
     This function create a service/Daemon that will execute a det. task 
    """ 

    try: 
    # Store the Fork PID 
    pid = os.fork() 

    if pid > 0: 
     print 'PID: %d' % pid 
     os._exit(0) 

    except OSError, error: 
    print 'Unable to fork. Error: %d (%s)' % (error.errno, error.strerror) 
    os._exit(1) 

    doTask() 

def doTask(): 
    """ 
     This function create a task that will be a daemon 
    """ 

    # Open the file in write mode 
    file = open('/tmp/tarefa.log', 'w') 

    # Start the write 
    while True: 
    print >> file, time.ctime() 
    file.flush() 
    time.sleep(2) 

    # Close the file 
    file.close() 

if __name__ == '__main__': 

    # Create the Daemon 
    createDaemon() 

और फिर डाल सकता है जो कुछ भी काम आप doTask() ब्लॉक के अंदर की जरूरत है।

आपको इसे & का उपयोग करके लॉन्च करने की आवश्यकता नहीं होगी, और यह आपको निष्पादन को थोड़ा और अनुकूलित करने की अनुमति देगा।

83

अपने स्वयं के डिमन लिखने के बजाय, python-daemon का उपयोग करें! python-daemonPEP 3143, "मानक डिमन प्रक्रिया लाइब्रेरी" के अच्छी तरह से व्यवहार किए गए डेमन विनिर्देश लागू करता है।

मैंने इस प्रश्न के स्वीकृत उत्तर के आधार पर उदाहरण कोड शामिल किया है, और भले ही कोड लगभग समान दिखता है, लेकिन इसका एक महत्वपूर्ण मौलिक अंतर है। python-daemon के बिना आपको अपनी प्रक्रिया को पृष्ठभूमि में रखने के लिए & का उपयोग करना होगा और nohup और जब आप अपने खोल से बाहर निकलेंगे तो अपनी प्रक्रिया को मारने से रोकें। इसके बजाए जब आप प्रोग्राम चलाते हैं तो यह स्वचालित रूप से आपके टर्मिनल से अलग हो जाएगा।

उदाहरण के लिए:

import daemon 
import time 

def do_something(): 
    while True: 
     with open("/tmp/current_time.txt", "w") as f: 
      f.write("The time is now " + time.ctime()) 
     time.sleep(5) 

def run(): 
    with daemon.DaemonContext(): 
     do_something() 

if __name__ == "__main__": 
    run() 

वास्तव में यह चलाने के लिए:

python background_test.py 

और यहाँ & के अभाव ध्यान दें।

इसके अलावा, this other stackoverflow answerpython-daemon का उपयोग करने के कई लाभों को विस्तार से बताता है।

+1

आप आश्चर्यचकित होंगे, लेकिन पीईपी लेखक और पुस्तकालय लेखक एक ही व्यक्ति हैं। तो हाँ, पुस्तकालय बहुत अच्छी तरह से लागू है कि पीईपी :) – Reishin

+0

आप कहते हैं "यह अन्य स्टैक ओवरफ्लो उत्तर" लेकिन एक प्रश्न से लिंक, जवाब नहीं। आपके द्वारा लिंक किए गए प्रश्न का चयनित उत्तर (इस टिप्पणी के समय) पायथन-डेमन का उपयोग नहीं करता है। शायद आप https://stackoverflow.com/a/688448/117471 का मतलब था? –

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