2012-12-05 10 views
9

मैंने werkzeug का उपयोग करके छोटा वेब सर्वर बनाया है और मैं इसे python my_server.py के साथ सामान्य पायथन तरीके से चलाने में सक्षम हूं। पेज लोड, सबकुछ ठीक काम करता है। अब जब मैं अपने पीसी बूट करता हूं तो इसे शुरू करना चाहता हूं। ऐसा करने का सबसे आसान तरीका क्या है? मैं नवोदय साथ संघर्ष कर रहा है, लेकिन यह "एक पृष्ठभूमि में रहते हैं" के लिए cuz के बाद मैं start my_server निष्पादित मैं तुरंत kernel: [ 8799.793942] init: my_server main process (7274) terminated with status 1बूट समय पर डिमन के रूप में पाइथन स्क्रिप्ट चलाएं (उबंटू)

my_server.py प्राप्त प्रतीत नहीं होता:

... 
if __name__ == '__main__': 
    from werkzeug.serving import run_simple 
    app = create_app() 
    run_simple('0.0.0.0', 4000, app) 

नवोदय विन्यास फाइल my_server.conf :

description "My service" 
author "Some Dude <[email protected]>" 
start on runlevel [2345] 
stop on runlevel [016] 
exec /path/to/my_server.py 
start on startup 

कोई विचार यह कैसे काम करता है? या स्क्रिप्ट को खत्म करने के लिए कोई और बेहतर तरीका है?

अद्यतन: मुझे विश्वास है कि समस्या my_server.py के भीतर है। ऐसा लगता है कि वेबसर्वर (विधि run_simple()) पहली जगह में शुरू नहीं होता है। .py फ़ाइल को टास्क हैंडलर जैसे अपस्टार्ट द्वारा चलाने के लिए क्या कदम उठाने चाहिए? पहली पंक्ति के रूप

  • प्लेस कुटिया #!/usr/bin/env python
  • अनुमति दें निष्पादन अनुमतियों chmod 755
  • प्रारंभ सुपर उपयोगकर्ता अधिकारों के साथ डेमॉन
  • सुनिश्चित करें कि सभी अजगर पुस्तकालयों रहे हैं (पूरी तरह से सुनिश्चित कोई अनुमति प्रतिबंध शुरू से रोकता है) क्या आप वहां मौजूद हैं! बाकी
  • कुछ?

हल: समस्या अजगर निर्भरता याद आ रही थी। कार्य प्रबंधक के माध्यम से स्क्रिप्ट शुरू करते समय (उदा। upstart या start-stop-daemon) कोई त्रुटि नहीं फेंक दी जाती है। पूरी तरह से यह सुनिश्चित करने की आवश्यकता है कि Pythonpath में आपको जो भी चाहिए वह शामिल है। ऐसा करने के लिए crontab उपयोग कर रहा है

+0

रनलेवल 235 का प्रयास करें और आप जिस सर्वर को सर्वर चलाते हैं, उसे 4000 निजीकृत बंदरगाहों का उपयोग करें, जिसके लिए व्यवस्थापक की कठोरता की आवश्यकता होती है। – Denis

+0

मैं इसे सुपरसियर के रूप में चलाता हूं और रनलेवल को बदलकर 235 तक मदद नहीं करता था। – and3p

+0

क्या यह संभव है कि आपके ऐप की निर्भरता सेवाएं अभी तक शुरू नहीं हुई हैं? कुछ डेटाबेस की तरह? – tdihp

उत्तर

11

एक आसान तरीका:

$ crontab -e 

एक crontab फ़ाइल, संपादन के लिए दिखाई देगा अंत में लाइन लिखें:

@reboot python myserver.py 

और छोड़ दिया। अब, प्रत्येक रीबूट के बाद, क्रॉन डिमन आपके myserver पायथन स्क्रिप्ट चलाएगा।

$ sudo service myserver start 
* Starting system myserver.py Daemon       [ OK ] 
$ sudo service myserver status 
* /path/to/myserver.py is running 
$ sudo service myserver stop 
* Stopping system myserver.py Daemon       [ OK ] 

और का उपयोग कर एक स्टार्टअप सेवा के रूप में यह निर्धारित करें:

+3

आपका सुझाव काम कर सकता है, लेकिन मैं दुर्घटना के मामले में पूरे सिस्टम को रिबूट करने के बजाय डिमन को प्रारंभ/बंद/पुनः प्रारंभ करने में सक्षम होना पसंद करता हूं। – and3p

+1

आप http://www.jejik.com/articles/2007/02/a_simple_unix_linux_daemon_in_python/ देख सकते हैं, यदि आप अपने कोड को एक वास्तविक डिमन बनाने में रुचि रखते हैं (मैंने सोचा कि यह पहले से ही था, और आपको केवल इसे शुरू करने की आवश्यकता है बूट समय पर) – kaspersky

17

gg.kaspersky विधि के अलावा, आप भी अपनी स्क्रिप्ट एक "सेवा" में इतना है कि आप शुरू करने या का उपयोग कर इसे बंद कर सकते हैं बदल सकती है,:

$ sudo update-rc.d myserver defaults 

ऐसा करने के लिए, तो आप इस फ़ाइल बनाने और /etc/init.d/ में यह सहेजना होगा।

#!/bin/sh -e 

DAEMON="/path/to/myserver.py" 
DAEMONUSER="myuser" 
DAEMON_NAME="myserver.py" 

PATH="/sbin:/bin:/usr/sbin:/usr/bin" 

test -x $DAEMON || exit 0 

. /lib/lsb/init-functions 

d_start() { 
     log_daemon_msg "Starting system $DAEMON_NAME Daemon" 
     start-stop-daemon --background --name $DAEMON_NAME --start --user $DAEMONUSER --exec $DAEMON 
     log_end_msg $? 
} 

d_stop() { 
     log_daemon_msg "Stopping system $DAEMON_NAME Daemon" 
     start-stop-daemon --name $DAEMON_NAME --stop --retry 5 --name $DAEMON_NAME 
      log_end_msg $? 
} 

case "$1" in 

     start|stop) 
       d_${1} 
       ;; 

     restart|reload|force-reload) 
         d_stop 
         d_start 
       ;; 

     force-stop) 
       d_stop 
       killall -q $DAEMON_NAME || true 
       sleep 2 
       killall -q -9 $DAEMON_NAME || true 
       ;; 

     status) 
       status_of_proc "$DAEMON_NAME" "$DAEMON" "system-wide $DAEMON_NAME" && exit 0 || exit $? 
       ;; 
     *) 
       echo "Usage: /etc/init.d/$DAEMON_NAME {start|stop|force-stop|restart|reload|force-reload|status}" 
       exit 1 
       ;; 
esac 
exit 0 

इस उदाहरण में, मैं, अपने अजगर फ़ाइल के सिर पर आप # की तरह एक मामला है मान लेते हैं!/Usr/bin/अजगर ताकि आप इसे सीधे निष्पादित कर सकते हैं।

इतना ही नहीं बल्कि, भूल नहीं अपने अजगर सर्वर से और सेवा स्क्रिप्ट के निष्पादन अधिकार देने के लिए:

$ sudo chmod 755 /etc/init.d/myserver 
$ sudo chmod 755 /path/to/mserver.py 

यहाँ page जहां मैं इस मूल रूप से (फ्रेंच) सीखा है।

चीयर्स।

+0

एक डेमॉन बनाने के लिए होव पर अच्छी व्याख्या, लेकिन जैसा कि मेरे अपडेट से पता चलता है कि मुझे विश्वास है कि 'स्क्रिप्ट' के साथ कुछ गलत है। – and3p

+0

@tvuillemin: यह विधि मेरे लिए उपयोगी थी, लेकिन मुझे अपनी स्क्रिप्ट डीबग करने की आवश्यकता है ... मुझे अपने डेमॉन स्क्रिप्ट का मानक और त्रुटि आउटपुट कहां मिल सकता है? – Throoze

4

यदि आपके पास बूट पर शुरू होने वाली supervisor सेवा है, तो एक पर्यवेक्षक सेवा लिखें, बहुत आसान है।

यदि आपका प्रोग्राम विफल रहता है तो आप ऑटोरेस्टार्ट भी सेट कर सकते हैं।

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