algootro quesistemad

algootro quesistemad

Esta preguntaQuizás esté relacionado con el que estoy preguntando aquí.

Esto es en el contexto dehttps://github.com/bstarynk/helpcovid/(un software GPLv3+ para Linux, actualmente -abril de 2020- enactivodesarrollo, que es una aplicación web multiproceso C++ especializada para Linux, por lo quetrabajo en progresoel 8 de abril de 2020)

Estoy alquilando un VPS en un host b-star-y.techque ejecuta Linux/Debian/Buster.

Me estoy desarrollando con otrosayudacovid, un software de aplicación web GPLv3+ multiproceso codificado para Linux en C++17.

no estoy familiarizado consystemd, que es utilizado por Debian/Buster en ese host, o condocker

me gustaria implementarel siguiente bucle infinitoen un git cloneárbol de archivos d.

  • git pull
  • make
  • ejecutar ./helpcovid -D -T2con stderr y stdout redirigidos a algún archivo.
  • sleep 5

yrepetir indefinidamente.

Estoy tentado a usar uncrontabtrabajo, o tal vez atdconbatch

¿Existe una mejor manera de hacerlo systemd?

Puedes enviarme un correo electrónico a[email protected]

Respuesta1

Durante aproximadamente un cuarto de siglo, hemos tenido conjuntos de herramientas que permiten a los usuarios sin privilegios ejecutar servicios nonce ad hoc. Herramientas demoníacas de Daniel J. Bernsteines uno de los primeros. uno notenerpara configurar directorios de escaneo y otra infraestructura. Uno puede simplemente ejecutar un programa bajosupervisedirectamente. Conjunto de herramientas UCSPI-TCP de M. Bernstein, además, es un ejemplo de los diversos conjuntos de herramientas que hemos tenido durante un período de tiempo similar que manejan servicios que necesitan aceptar conexiones TCP y hacer otras cosas.

Hay otros conjuntos de herramientas que hacen lo mismo, sin necesidad de systemd y, por supuesto, con systemd se puedetambiénconfigurar servicios ad hoc por usuario.

Estamos en 2020. No hay ninguna buena razón para escribir nuevos programas que utilicen el desvencijado y peligroso mecanismo de archivos PID. No es necesario ningún código de archivo PID que haya escrito.

De manera similar, es una buena idea escribir un servidor TCP para que puedaheredarsu socket de escucha, como un descriptor de archivo ya abierto. De hecho, esta es la forma en quetodo el sistemaLos servicios, gestionados por la Inted, han funcionado convencionalmente desde los años 1980. También se puede hacer con servicios por usuario. Los conjuntos de herramientas s6 y nosh, y de hecho systemd, proporcionan formas en las que se puede dar a un servicio su conector de escucha. No hay necesidad decualquierde ese código de análisis de URL nonce que ha escrito, que como muchos analizadores improvisados ​​no maneja todas las formas que puede adoptar una URL.

Desafortunadamente, como dije, su cpp-httplibbiblioteca no tiene un constructor o miembro de función donde pueda serdadoel descriptor de archivo para el socket de escucha. Este es un descuido importante en el diseño de esa biblioteca, dado que heredar descriptores de archivos de socket ha sido una práctica normal durante tres décadas y pico.

algootro quesistemad

Ambosmi conjunto de herramientas de narizyConjunto de herramientas s6 de Laurent Bercotproporcionar formas de ejecutar programas nonce como servicios ad hoc por usuario.

Debajo del conjunto de herramientas nosh, uno tendría un helpcovidsubdirectorio, con un servicesubdirectorio debajo que contiene los diversos programas para manejar el servicio.

helpcovid/service/starty helpcovid/service/stopson bastante mínimos:

#!/bin/nosh                                                         
#Start file generated from ./helpcovid.socketand ./helpcovid.service
true
#!/bin/nosh
#Stop file generated from ./helpcovid.socketand ./helpcovid.service
true

La carne está adentro helpcovid/service/runy helpcovid/service/service:

#!/bin/nosh
#Run file generated from ./helpcovid.socketand ./helpcovid.service
#Starynkevitch helpcovid listening socket
tcp-socket-listen --systemd-compatibility ::0 50002
envdir env
setenv LC_ALL fr_FR.UTF-8
chdir /home/basile/dev/helpcovid/test
./service
#!/bin/nosh
#Service file generated from ./helpcovid.service
#Starynkevitch helpcovid service
sh -c 'exec /home/basile/dev/helpcovid/work/helpcovid ${flags}'

Y helpcovid/service/restartcontrola la lógica de reinicio:

#!/bin/sh
#Restart file generated from ./helpcovid.service
sleep 5
exec true   # ignore script arguments

Éste se ejecutaría entregándolo a una instancia por usuario de service-manager. El conjunto de herramientas vincula y escucha en el socket, lee la configuración de la variable de entorno desde un envdir y pasa el descriptor del archivo abierto al programa eventual usando el LISTEN_FDSprotocolo, habiendo cambiado el directorio de trabajo al lugar donde webroot/reside su directorio de prueba.

s6 emplea una estructura similar, aunque los nombres de las herramientas son diferentes (p. ej.s6-tcpserver6-socketbinderen vez detcp-socket-listen) y la lógica de reinicio se maneja de manera diferente. s6 no requiere un administrador de servicios. Al igual que los daemontools originales, uno puede simplemente ejecutars6-supervisemanualmente para invocar un servicio:

s6-supervisar ./helpcovid/service/

No voy a entrar en muchos detalles, ya que el punto principal es que no tener systemd no es excusa para un mal diseño de demonios (de hecho, los buenos principios de diseño de demoniosoriginado conmecanismos mucho más antiguos que no son systemd) y que los mecanismos para pasar descriptores de archivos abiertos para sockets de escucha se aplican y pueden usarse con más que solo systemd.

sistemad

Los programas antes mencionados en realidad fueron convertidos desde un systemdunidad de enchufeyunidad de servicioque rápidamente preparé. Muestran cómo se configuraría un servicio por usuario en systemd, con archivos en ~/.config/systemd/user/:

# helpcovid.socket
[Unit]
Description=Starynkevitch helpcovid listening socket
[Socket]
ListenStream=50002
Accept=No
[Install]
Wanted-By=default.target
# helpcovid.service
[Unit]
Description=Starynkevitch helpcovid service
[Service]
Environment=LC_ALL=fr_FR.UTF-8
Restart=always
RestartSec=5
ExecStart=/home/basile/dev/helpcovid/work/helpcovid ${flags}
WorkingDirectory=/home/basile/dev/helpcovid/test
#This has no meaning for systemd.
EnvironmentDirectory=env

Esto se controla con programas como systemctl --user start helpcovid.socket.

En el mundo de systemd, estossonlos archivos de configuración. ¿El usuario quiere cambiar el número de puerto TCP? El usuario cambia elListenStream= configuración. No se necesitan variables de entorno adicionales redundantes para configurar la configuración regional. El usuario simplemente establece la LC_ALLvariable real (o cualquier otra) de la manera que se muestra.

Inicio sesión

El registro también lo gestiona la gestión de servicios. El conjunto de herramientas nosh y la forma s6 es enviar la salida estándar y el error estándar a través de una tubería a un servicio secundario que ejecuta cyclog, s6-logo algo así. systemd mete la salida del registro en la parte de usuario del diario centralizado de systemd, que usted utilizajournalctl --user para leer.

tu programa

Su programa necesita iniciar sesión std::clog(es decir, error estándar), llamar setlocale()a with NULLpara leer las variables de entorno estándar y tener un código que maneje lasLISTEN_FDS mecanismo. Hay muchas opciones para esto último, desde una biblioteca de funciones auxiliares no portátil que viene con systemd hasta otras similares más portátiles.

Definitivamente es mucho menos código para ingresar que todo ese código de análisis de números de puerto TCP, código de archivo PID desvencijado y peligroso, HELPCOVID_LOCALEy--locale que se puede eliminar de esta manera. ☺

Otras lecturas

información relacionada