Score:2

ฉันจะสร้างบริการ python 3 ที่ใช้ซ็อกเก็ตกับ systemd ได้อย่างไร

ธง us

ฉันกำลังพยายามสร้างบริการด้วย systemd ซึ่งฉันใช้ python3 เพื่อสร้างซ็อกเก็ตอย่างง่ายและปล่อยให้เป็น daemon แต่ฉันได้พยายามหลายครั้ง แต่ในทั้งสองกรณีไม่ประสบความสำเร็จสำหรับวันนี้ systemd ชนะฉัน แต่พรุ่งนี้เป็นอีกวันที่จะลอง

เซิร์ฟเวอร์

ซ็อกเก็ตนำเข้า 
โฮสต์ = '127.0.0.1'
พอร์ต = 9999
BUFFER_SIZE=1024 

ด้วย socket.socket(socket.AF_INET, socket.SOCK_STREAM) เป็น socket_tcp:
    socket_tcp.bind((โฮสต์, พอร์ต)) 
    socket_tcp.listen(5) # Esperamos la conexión del cliente 
    conn, addr = socket_tcp.accept() # Establecemos la conexión กับลูกค้า 
    พร้อมคอนเน็กเตอร์:
        พิมพ์ ('[*] Conexión establecida') 
        ในขณะที่ทรู:
            # Recibimos ไบต์, converterimos และ str
            ข้อมูล = conn.recv (BUFFER_SIZE)
            # Verificamos que hemos recibido datos
            ถ้าไม่ใช่ข้อมูล:
                หยุดพัก
            อื่น:
                พิมพ์ ('[*] Datos recibidos: {}'.format (data.decode ('utf-8'))) 
            conn.send(data) # Hacemos echo convirtiendo de nuevo a ไบต์

ลูกค้า

ซ็อกเก็ตนำเข้า
# El cliente debe tener las mismas especificaciones del servidor
โฮสต์ = '127.0.0.1'
พอร์ต = 9999

BUFFER_SIZE = 1024 MESSAGE = 'สวัสดี ชาวโลก!' # Datos que queremos enviar กับ socket.socket(socket.AF_INET, socket.SOCK_STREAM) เป็น socket_tcp:
    socket_tcp.connect((โฮสต์ พอร์ต))
    # Convertimos str ไบต์
    socket_tcp.send (MESSAGE.encode ('utf-8'))
    ข้อมูล = socket_tcp.recv (BUFFER_SIZE)

ไฟล์กำหนดค่าหน่วย

sudo nano /etc/systemd/system/socket_prueba.service
sudo rm -r /etc/systemd/system/socket_prueba.service
[หน่วย]
คำอธิบาย= ระบบรีเลย์เซิร์ฟเวอร์: ผู้จัดการ
After=multi-user.target

[บริการ]
ประเภท = ง่าย
เริ่มใหม่ = เสมอ
ExecStart=/usr/local/bin/pipenv เรียกใช้ python /path/test_server.py

[ติดตั้ง]
WantedBy=multi-user.target

sudo systemctl daemon โหลดซ้ำ
sudo systemctl เปิดใช้งาน socket_prueba.service
sudo systemctl เริ่ม socket_prueba.service
sudo systemctl สถานะ socket_prueba.service

ผลลัพธ์:

â socket_prueba.service - ระบบรีเลย์เซิร์ฟเวอร์: ผู้จัดการ
     โหลดแล้ว: โหลดแล้ว (/etc/systemd/system/socket_prueba.service; เปิดใช้งาน; การตั้งค่าล่วงหน้าของผู้ขาย: เปิดใช้งาน)
     ใช้งานอยู่: ล้มเหลว (ผลลัพธ์: exit-code) ตั้งแต่วันเสาร์ 2021-09-25 16:07:17 -05; 58 นาทีที่แล้ว
    กระบวนการ: 25771 ExecStart=/usr/local/bin/pipenv เรียกใช้ python 

/บ้าน/เส้นทาง>
   PID หลัก: 25771 (รหัส=ออก สถานะ=2)

25 ก.ย. 16:07:17 serversaas systemd[1]: socket_prueba.service: งานรีสตาร์ทตามกำหนดเวลา ตัวนับการรีสตาร์ทคือ >
25 ก.ย. 16:07:17 น. serversaas systemd[1]: เซิร์ฟเวอร์หยุดทำงาน ระบบรีเลย์: ผู้จัดการ
25 ก.ย. 16:07:17 น. serversaas systemd[1]: socket_prueba.service: เริ่มคำขอซ้ำเร็วเกินไป
25 ก.ย. 16:07:17 น. serversaas systemd[1]: socket_prueba.service: ล้มเหลวด้วยผลลัพธ์ 'exit-code'
25 ก.ย. 16:07:17 น. serversaas systemd[1]: ไม่สามารถเริ่มระบบรีเลย์เซิร์ฟเวอร์: ผู้จัดการ

เจตนา 2 ที่มา: systemd และ python

ซ็อกเก็ตกับ python y systemd

â socket_prueba.socket - ซ็อกเก็ต prueba
     โหลดแล้ว: โหลดแล้ว (/etc/systemd/system/socket_prueba.socket; ปิดใช้งาน; ค่าที่ตั้งไว้ล่วงหน้าของผู้ขาย: เปิดใช้งาน)
     ใช้งานอยู่: ล้มเหลว (ผลลัพธ์: service-start-limit-hit) ตั้งแต่วันเสาร์ 2021-09-25 17:00:47 -05; 4 วินาทีที่แล้ว
   ทริกเกอร์: â socket_prueba.service
     ฟัง: 127.0.0.1:9999 (สตรีม)

25 ก.ย. 17:00:47 น. vidm-OMEN systemd[1]: กำลังฟังบน Socket prueba
25 ก.ย. 17:00:47 น. vidm-OMEN systemd[1]: socket_prueba.socket: ล้มเหลวด้วยผลลัพธ์ 'service-start-limit-hit'
Michael Hampton avatar
cz flag
ตรวจสอบบันทึกเพื่อดูว่าเกิดอะไรขึ้น เช่น `journalctl -l -u socket_prueba.service`
Score:3
ธง us

พร้อมแล้วสำหรับคำสั่งปรับใช้เชลล์อย่างง่ายสำหรับกรณีของคุณ คุณสามารถเปลี่ยนไดเร็กทอรี ชื่อ คำอธิบายของบริการหรือสคริปต์ และอื่นๆ คำอธิบายอยู่ด้านล่าง:

สร้างไดเร็กทอรีและสคริปต์เอง

mkdir /usr/src/python-socket -p

แมว > /usr/src/python-socket/python-socket.py << 'EOL'
ซ็อกเก็ตนำเข้า 
โฮสต์ = '127.0.0.1'
พอร์ต = 9999
BUFFER_SIZE=1024 

ด้วย socket.socket(socket.AF_INET, socket.SOCK_STREAM) เป็น socket_tcp:
    socket_tcp.bind((โฮสต์, พอร์ต)) 
    socket_tcp.listen(5) # Esperamos la conexión del cliente 
    conn, addr = socket_tcp.accept() # Establecemos la conexión กับลูกค้า 
    พร้อมคอนเน็กเตอร์:
        พิมพ์ ('[*] Conexión establecida') 
        ในขณะที่ทรู:
            # Recibimos ไบต์, converterimos และ str
            ข้อมูล = conn.recv (BUFFER_SIZE)
            # Verificamos que hemos recibido datos
            ถ้าไม่ใช่ข้อมูล:
                หยุดพัก
            อื่น:
                พิมพ์ ('[*] Datos recibidos: {}'.format (data.decode ('utf-8'))) 
            conn.send(data) # Hacemos echo convirtiendo de nuevo a ไบต์
EOL

ตั้งค่าตัวแปรสำหรับสร้างบริการ systemd

SERVICE_NAME=python-socket
SERVICE_DESCRIPTION="ทดสอบบริการไพธอน"
SERVICE_COMMAND="/usr/bin/python3 /usr/src/python-socket/python-socket.py"
SERVICE_WORK_DIR=/usr/src/python-socket/
SERVICE_USER=ราก

ปรับใช้การกำหนดค่าบริการ systemd

cat > /etc/systemd/system/${SERVICE_NAME}.service << EOL
[หน่วย]
คำอธิบาย=${SERVICE_DESCRIPTION}
After=multi-user.target

[บริการ]
สภาพแวดล้อม = "จาก = ระบบ"
WorkingDirectory=${SERVICE_WORK_DIR}
ประเภท = ง่าย
ผู้ใช้=${SERVICE_USER}
ExecStart=${SERVICE_COMMAND}
RemainAfterExit=ไม่
เริ่มใหม่ = เสมอ
รีสตาร์ทวินาที = 2
StartLimitBurst=999999
StartLimitInterval=0
KillMode=กระบวนการ

[ติดตั้ง]
WantedBy=multi-user.target
EOL

สมัครบริการใหม่ เริ่มต้นและตรวจสอบ

systemctl daemon-โหลดซ้ำ
systemctl เปิดใช้งาน ${SERVICE_NAME}
systemctl หยุด ${SERVICE_NAME}
systemctl เริ่มต้น ${SERVICE_NAME}
สถานะ systemctl ${SERVICE_NAME}

ดังนั้นการกำหนดค่าบริการ systemd ของคุณจะมีลักษณะดังนี้

[หน่วย]
Description=ทดสอบบริการหลาม
After=multi-user.target

[บริการ]
สภาพแวดล้อม = "จาก = ระบบ"
WorkingDirectory=/usr/src/python-socket/
ประเภท = ง่าย
ผู้ใช้ = ราก
ExecStart=/usr/bin/python3 /usr/src/python-socket/python-socket.py
RemainAfterExit=ไม่
เริ่มใหม่ = เสมอ
รีสตาร์ทวินาที = 2
StartLimitBurst=999999
StartLimitInterval=0
KillMode=กระบวนการ

[ติดตั้ง]
WantedBy=multi-user.target

ที่ไหน:

สภาพแวดล้อม = "จาก = ระบบ" - ตัวแปร env บางตัวถ้าคุณต้องการส่งไปยังสคริปต์ไพ ธ อนของคุณ

ประเภท = ง่าย - บริการ systemd อย่างง่ายจะทำงานในขณะที่สคริปต์ทำงาน

RemainAfterExit=ไม่
เริ่มใหม่ = เสมอ
รีสตาร์ทวินาที = 2
StartLimitBurst=999999
StartLimitInterval=0

พารามิเตอร์เหล่านี้จะไม่อนุญาตให้สคริปต์ของคุณหยุดทำงานในเงื่อนไขใด ๆ ที่จะเริ่มล้มเหลวอย่างต่อเนื่อง

KillMode=กระบวนการ - นี่คือวิธีที่สคริปต์ของคุณจะหยุดทำงาน หากคุณไม่มีเหตุการณ์ SIG พิเศษในสคริปต์ไพธอนของคุณ มันจะเป็นสากล

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา