Подтвердить что ты не робот

Как сделать Python script запущенным как сервис?

Я хочу запустить python script на сервере CENTOS:

#!/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 использует $ python flashpolicyd.py, и он отлично работает... Вопрос в следующем: как сохранить этот script запуск даже после закрытия консоли ssh?

4b9b3361

Ответ 1

Я использую этот код для демонстрации моих приложений. Он позволяет start/stop/restart script использовать следующие команды.

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

В дополнение к этому у меня также есть init.d script для управления моей службой. Это позволяет автоматически запускать службу при загрузке операционной системы.

Вот простой пример, чтобы получить ваш ход. Просто переместите код внутри класса и вызовите его из функции run внутри 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

Если вы используете операционную систему, использующую Upstart (например, CentOS 6), вы также можете использовать Upstart для управления сервисом. Если вы используете Upstart, вы можете сохранить свой script как есть и просто добавить что-то вроде этого в /etc/init/my-service.conf

start on started sshd
stop on runlevel [!2345]

exec /usr/bin/python /opt/my_service.py
respawn

Затем вы можете использовать start/stop/restart для управления вашим сервисом.

например.

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

Более подробный пример работы с выскочкой доступен здесь.

Systemd

Если вы используете операционную систему, использующую Systemd (например, CentOS 7), вы можете взглянуть на следующий ответ на вопрос о стекировании.

Ответ 2

Предлагаю две рекомендации:

supervisord

1) Установите пакет supervisor (более подробные инструкции здесь):

sudo apt-get install supervisor

2) Создайте файл конфигурации для своего демона в /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) Перезагрузите supervisor, чтобы загрузить новый .conf

supervisorctl update
supervisorctl restart flashpolicyd

systemd (если в настоящее время используется дистрибутив Linux)

[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

Поместите этот файл в /etc/systemd/system/my_daemon.service и включите его, используя systemctl daemon-reload && systemctl enable my_daemon && systemctl start my_daemon --no-block.

Для просмотра журналов:

systemctl status my_daemon

Ответ 3

Мой непифонический подход будет использоваться и суффикс. То есть:

python flashpolicyd.py &

Чтобы остановить script

killall flashpolicyd.py

также трубопровод и суффикс с отключением поставили бы этот процесс под суперсовременный (верхний):

python flashpolicyd.pi & disown

Ответ 4

сначала импортируйте модуль os в ваше приложение, чем с помощью функции getpid get pid app и сохраните файл. Например:

import os
pid = os.getpid()
op = open("/var/us.pid","w")
op.write("%s" % pid)
op.close()

и создайте файл bash в пути /etc/init.d: /etc/init.d/servername

PATHAPP="/etc/bin/userscript.py &"
PIDAPP="/var/us.pid"
case $1 in 
        start)
                echo "starting"
                $(python $PATHAPP)
        ;;
        stop)
                echo "stoping"
                PID=$(cat $PIDAPP)
                kill $PID
        ;;

esac

теперь u может запускать и останавливать приложение ur с помощью команды down:

имя сервера службы stop service servername start

или

/etc/init.d/servername stop /etc/init.d/servername start

Ответ 5

для моего script python, я использую...

В START python script:

start-stop-daemon --start --background --pidfile $PIDFILE --make-pidfile --exec $DAEMON

В STOP python script:

PID=$(cat $PIDFILE)
kill -9 $PID
rm -f $PIDFILE

P.S.: Извините за плохой английский, я из CHILE: D