Puncte:2

Cum creez un serviciu Python 3 care utilizează socket cu systemd?

drapel us

Încerc să creez un serviciu cu systemd, unde folosesc python3 pentru a crea un socket simplu și îl las ca un daemon, dar am făcut mai multe încercări, dar în ambele cazuri fără succes.Pentru azi systemd m-a învins, dar mâine este o altă zi de încercat.

Server

priză de import 
gazdă = '127.0.0.1'
port = 9999
BUFFER_SIZE = 1024 

cu socket.socket(socket.AF_INET, socket.SOCK_STREAM) ca socket_tcp:
    socket_tcp.bind((gazdă, port)) 
    socket_tcp.listen(5) # Sperăm la conexión del cliente 
    conn, addr = socket_tcp.accept() # Stabilim conexiunea cu clientul 
    cu conn:
        print('[*] Conexión stabilita') 
        în timp ce este adevărat:
            # Recibim bytes, convertimos en str
            date = conn.recv(BUFFER_SIZE)
            # Verificăm că am primit datele
            daca nu date:
                pauză
            altceva:
                print('[*] Date primite: {}'.format(data.decode('utf-8'))) 
            conn.send(data) # Facem echo convirtiind noii octeți

Client

priză de import
# Clientul trebuie să aibă aceleași specificații ale serverului
gazdă = '127.0.0.1'
port = 9999

BUFFER_SIZE = 1024 MESSAGE = 'Hola, mundo!' # Datele pe care le vom trimite cu socket.socket(socket.AF_INET, socket.SOCK_STREAM) ca socket_tcp:
    socket_tcp.connect((gazdă, port))
    # Convertim str a bytes
    socket_tcp.send(MESSAGE.encode('utf-8'))
    date = socket_tcp.recv(BUFFER_SIZE)

Fișierul unității de configurare

sudo nano /etc/systemd/system/socket_prueba.service
sudo rm -r /etc/systemd/system/socket_prueba.service
[Unitate]
Descriere= Server Relay System: Manager
După=multi-user.target

[Serviciu]
Tip=simplu
Restart=intotdeauna
ExecStart=/usr/local/bin/pipenv rulați python /path/test_server.py

[Instalare]
WantedBy=multi-user.target

sudo systemctl daemon-reload
sudo systemctl enable socket_prueba.service
sudo systemctl start socket_prueba.service
sudo systemctl status socket_prueba.service

Rezultat:

â socket_prueba.service - Server Relay System: Manager
     Încărcat: încărcat (/etc/systemd/system/socket_prueba.service; activat; prestabilit furnizor: activat)
     Activ: eșuat (Rezultat: cod de ieșire) din sâmb. 2021-09-25 16:07:17 -05; acum 58 minute
    Proces: 25771 ExecStart=/usr/local/bin/pipenv rulează python 

/home/cale>
   PID principal: 25771 (cod=ieșit, stare=2)

25 sep 16:07:17 serversaas systemd[1]: socket_prueba.service: lucrare de repornire programată, contorul de repornire este >
25 sep 16:07:17 serversaas systemd[1]: Sistem de retransmisie server oprit: Manager.
25 sep 16:07:17 serversaas systemd[1]: socket_prueba.service: Cererea de pornire s-a repetat prea repede.
25 sep 16:07:17 serversaas systemd[1]: socket_prueba.service: A eșuat cu rezultatul „exit-code”.
25 sep 16:07:17 serversaas systemd[1]: Nu s-a pornit Server Relay System: Manager.

Intenția 2 Sursa: systemd și python

socket cu python și systemd

â socket_prueba.socket - Socket prueba
     Încărcat: încărcat (/etc/systemd/system/socket_prueba.socket; dezactivat; prestabilit furnizor: activat)
     Activ: eșuat (Rezultat: service-start-limit-hit) din sâmb. 2021-09-25 17:00:47 -05; acum 4s
   Declanșatoare: â socket_prueba.service
     Ascultă: 127.0.0.1:9999 (Stream)

25 sep 17:00:47 vidm-OMEN systemd[1]: Ascultare pe Socket prueba.
25 sep 17:00:47 vidm-OMEN systemd[1]: socket_prueba.socket: A eșuat cu rezultatul „service-start-limit-hit”.
Michael Hampton avatar
drapel cz
Verificați jurnalul pentru a afla ce sa întâmplat, de ex. `journalctl -l -u socket_prueba.service`
Puncte:3
drapel us

Aici este gata să porniți comenzi simple de implementare shell pentru cazul dvs., puteți schimba directoare, numele, descrierea serviciului sau scriptul și așa mai departe, descrierea este mai jos:

Creați directorul și scriptul în sine

mkdir /usr/src/python-socket -p

cat > /usr/src/python-socket/python-socket.py << „EOL”
priză de import 
gazdă = '127.0.0.1'
port = 9999
BUFFER_SIZE = 1024 

cu socket.socket(socket.AF_INET, socket.SOCK_STREAM) ca socket_tcp:
    socket_tcp.bind((gazdă, port)) 
    socket_tcp.listen(5) # Sperăm la conexión del cliente 
    conn, addr = socket_tcp.accept() # Stabilim conexiunea cu clientul 
    cu conn:
        print('[*] Conexión stabilita') 
        în timp ce este adevărat:
            # Recibim bytes, convertimos en str
            date = conn.recv(BUFFER_SIZE)
            # Verificăm că am primit datele
            daca nu date:
                pauză
            altceva:
                print('[*] Date primite: {}'.format(data.decode('utf-8'))) 
            conn.send(data) # Facem echo convirtiind noua octeți
EOL

Configurați variabile pentru crearea serviciului systemd

SERVICE_NAME=python-socket
SERVICE_DESCRIPTION="Testează serviciul Python"
SERVICE_COMMAND="/usr/bin/python3 /usr/src/python-socket/python-socket.py"
SERVICE_WORK_DIR=/usr/src/python-socket/
SERVICE_USER=rădăcină

Implementați configurația serviciului systemd

cat > /etc/systemd/system/${SERVICE_NAME}.service << EOL
[Unitate]
Descriere=${SERVICE_DESCRIPTION}
După=multi-user.target

[Serviciu]
Environment="FROM=SYSTEMD"
WorkingDirectory=${SERVICE_WORK_DIR}
Tip=simplu
Utilizator=${SERVICE_USER}
ExecStart=${SERVICE_COMMAND}
RemainAfterExit=nu
Restart=intotdeauna
RestartSec=2
StartLimitBurst=999999
StartLimitInterval=0
KillMode=proces

[Instalare]
WantedBy=multi-user.target
EOL

Aplicați un serviciu nou, porniți-l și verificați

systemctl daemon-reload
systemctl activați ${SERVICE_NAME}
systemctl opri ${SERVICE_NAME}
systemctl porniți ${SERVICE_NAME}
stare systemctl ${SERVICE_NAME}

Ca rezultat, configurația serviciului systemd va arăta ca

[Unitate]
Descriere=Testează serviciul Python
După=multi-user.target

[Serviciu]
Environment="FROM=SYSTEMD"
WorkingDirectory=/usr/src/python-socket/
Tip=simplu
Utilizator=rădăcină
ExecStart=/usr/bin/python3 /usr/src/python-socket/python-socket.py
RemainAfterExit=nu
Restart=intotdeauna
RestartSec=2
StartLimitBurst=999999
StartLimitInterval=0
KillMode=proces

[Instalare]
WantedBy=multi-user.target

Unde:

Environment="FROM=SYSTEMD" - o variabilă env dacă doriți să treceți la scriptul dvs. python

Tip=simplu - serviciu systemd simplu, va funcționa în timp ce scriptul este activ

RemainAfterExit=nu
Restart=intotdeauna
RestartSec=2
StartLimitBurst=999999
StartLimitInterval=0

Acești parametri nu vor permite ca scriptul dvs. să fie oprit în nicio condiție în care va începe să eșueze continuu

KillMode=proces - Așa se va opri scriptul dvs., dacă nu aveți evenimente SIG speciale în scriptul dvs. python, este universal

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.