Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to make Python script run as service?

I want to run a python script in a CENTOS server:

#!/usr/bin/env python import socket try:         import thread  except ImportError:     import _thread as thread #Py3K changed it. class Polserv(object):     def __init__(self):         self.numthreads = 0         self.tidcount   = 0         self.port       = 843         self.sock       = socket.socket(socket.AF_INET, socket.SOCK_STREAM)         self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)         self.sock.bind(('100.100.100.100', self.port))         self.sock.listen(5)     def run(self):         while True:             thread.start_new_thread(self.handle, self.sock.accept())      def handle(self,conn,addr):         self.numthreads += 1         self.tidcount   += 1         tid=self.tidcount         while True:             data=conn.recv(2048)             if not data:                 conn.close()                 self.numthreads-=1                 break             #if "<policy-file-request/>\0" in data:             conn.sendall(b"<?xml version='1.0'?><cross-domain-policy><allow-access-from domain='*' to-ports='*'/></cross-domain-policy>")             conn.close()             self.numthreads-=1             break         #conn.sendall(b"[#%d (%d running)] %s" % (tid,self.numthreads,data) ) Polserv().run() 

Im using $ python flashpolicyd.py and it works fine... The question is: How to keep this script running even after I close the terminal(console)?

like image 390
Filipe Tagliacozzi Avatar asked May 07 '13 13:05

Filipe Tagliacozzi


People also ask

How do I run a Python script from Systemd?

Insert the username in your OS where <username> is written. The ExecStart flag takes in the command that you want to run. So basically the first argument is the python path (in my case it's python3) and the second argument is the path to the script that needs to be executed.

Can you run a Python script on a server?

Since the Python interpreter is called using the command-line shell, it can execute any Python command from the SQL Server using the xp_cmdshell built-in extended procedure.


2 Answers

I use this code to daemonize my applications. It allows you start/stop/restart the script using the following commands.

python myscript.py start python myscript.py stop python myscript.py restart 

In addition to this I also have an init.d script for controlling my service. This allows you to automatically start the service when your operating system boots-up.

Here is a simple example to get your going. Simply move your code inside a class, and call it from the run function inside MyDeamon.

import sys import time  from daemon import Daemon   class YourCode(object):     def run(self):         while True:             time.sleep(1)   class MyDaemon(Daemon):     def run(self):         # Or simply merge your code with MyDaemon.         your_code = YourCode()         your_code.run()   if __name__ == "__main__":     daemon = MyDaemon('/tmp/daemon-example.pid')     if len(sys.argv) == 2:         if 'start' == sys.argv[1]:             daemon.start()         elif 'stop' == sys.argv[1]:             daemon.stop()         elif 'restart' == sys.argv[1]:             daemon.restart()         else:             print "Unknown command"             sys.exit(2)         sys.exit(0)     else:         print "usage: %s start|stop|restart" % sys.argv[0]         sys.exit(2) 

Upstart

If you are running an operating system that is using Upstart (e.g. CentOS 6) - you can also use Upstart to manage the service. If you use Upstart you can keep your script as is, and simply add something like this under /etc/init/my-service.conf

start on started sshd stop on runlevel [!2345]  exec /usr/bin/python /opt/my_service.py respawn 

You can then use start/stop/restart to manage your service.

e.g.

start my-service stop my-service restart my-service 

A more detailed example of working with upstart is available here.

Systemd

If you are running an operating system that uses Systemd (e.g. CentOS 7) you can take a look at the following Stackoverflow answer.

like image 114
eandersson Avatar answered Sep 25 '22 21:09

eandersson


I offer two recommendations:

supervisord

1) Install the supervisor package (more verbose instructions here):

sudo apt-get install supervisor 

2) Create a config file for your daemon at /etc/supervisor/conf.d/flashpolicyd.conf:

[program:flashpolicyd] directory=/path/to/project/root environment=ENV_VARIABLE=example,OTHER_ENV_VARIABLE=example2 command=python flashpolicyd.py autostart=true autorestart=true 

3) Restart supervisor to load your new .conf

supervisorctl update supervisorctl restart flashpolicyd 

systemd (if currently used by your Linux distro)

[Unit] Description=My Python daemon  [Service] Type=simple ExecStart=/usr/bin/python3 /opt/project/main.py WorkingDirectory=/opt/project/ Environment=API_KEY=123456789 Environment=API_PASS=password Restart=always RestartSec=2  [Install] WantedBy=sysinit.target 

Place this file into /etc/systemd/system/my_daemon.service and enable it using systemctl daemon-reload && systemctl enable my_daemon && systemctl start my_daemon --no-block.

To view logs:

systemctl status my_daemon

like image 45
pztrick Avatar answered Sep 22 '22 21:09

pztrick