Surgió una pregunta sobre StackOverflow sobre cómo escribir init.dscripts en Python. Un comentario indicó que estos scripts deberían programarse en shell, no en Python. Está escribiendo init.dguiones en Python:
Malo. Malo. Malo. Nunca hagas esto.
No es una práctica recomendada.
OK, con advertencias.
Dogma heredado.
Totalmente bien.
Sería genial conocer cualquier escenario de pesadilla, o si esta regla está escrita en la sangre de algunos administradores de sistemas.
Yo diría # 2, pero muy cerca del # 1 - "Malo. Malo. Malo. Nunca hagas esto". El estándar, tal como es, para los scripts de inicio de Linux está en el LSB , y aunque nunca sale y dice "estos son scripts de shell bourne", se hacen varias suposiciones. Una, que las líneas que comienzan con # son comentarios, resulta que funciona bien. Más problemático es el requisito de que el script de inicio ejecute los comandos desde /lib/lsb/init-functions"en el entorno actual (vea el punto de comando incorporado especial del shell)".
Pero lo más importante, si estás haciendo algo realmente complicado aquí, lo estás haciendo mal. Los guiones de inicio deben ser muy simples y utilitarios. Deben ser guiones en el sentido clásico, no programas. Es mejor absorberlo y crear un script de shell simple que cualquier administrador de sistemas pueda asimilar fácilmente en un vistazo rápido que hacer algo hermoso y diseñado en Python.
Otra consideración a tener en cuenta es systemd, que puede o no ser la Inicialización del sistema Future Of All en Linux. Bajo systemd, la inicialización se realiza mediante archivos de configuración simples en lugar de scripts, la idea es que todo inicio se ajusta a varios patrones de diseño estándar y realmente solo debería elegir uno. Si su programa usa algo complicado para la inicialización, eso debería salir del script de inicio en sí.
Me voy con esta respuesta. El punto es que Python no es necesario y no es estándar, y como tal puede crear un punto extra de depuración de incertidumbre y un punto extra de falla. En referencia a la pregunta SO original, deduzco que tales scripts pueden lanzar demonios, pero no deberían ser los demonios reales.
mjhm
Si recuerdo, no todas las distribuciones siguen LSB. Ver Debian.
Massimo
10
No veo ningún problema con esto, si sabe, con seguridad, que el intérprete de Python estará disponible cuando se ejecute el script init.d. Esto, para mí, indica que estás viendo algo que se está haciendo relativamente tarde en un nivel de ejecución multiusuario (o "consola gráfica").
Sin embargo ... Esto significa que una versión específica del intérprete de Python PUEDE ser vital para su secuencia de arranque y esta es una cosa más que debe verificar en las actualizaciones.
Supongo que esto significa que estoy diciendo "3. OK, con advertencias".
+1. Exactamente lo que estaba escribiendo. Los únicos "problemas" aquí serían asegurarse de cumplir con LSB (por ejemplo, proporcionar las funciones necesarias) y asegurarse de que el intérprete de Python que necesita esté disponible en tiempo de ejecución (y no esté roto).
Sam Halicke
3
Disponible en tiempo de ejecución puede ser complicado si el usuario ha elegido tener / usr en una partición separada. Será importante que su secuencia de comandos se ejecute después de que / usr esté montado, ya que python normalmente se instala en / usr.
Zoredache
@Zoredache - Ayup. Por lo general, sabe que "ha sucedido" cuando llega tarde en la secuencia de RC "multiusuario".
Vatine
2
Estoy de acuerdo con "3. OK, con advertencias", pero por diferentes razones. Mi experiencia en Solaris fue que tenían una copia del sistema operativo de Perl para algunos de sus programas internos. El script de shell no era más que el shell para que el Perl comenzara. ¿El guión de inicio tenía que estar escrito en sh? No, pero mejoró la mantenibilidad para el administrador. Y el guión de inicio no hizo nada más complicado que cosas como daemon --starto daemon --stop. Si hiciera esto, los usuarios habituales podrían iniciar su herramienta en modo no privilegiado, si eso tiene sentido en el contexto de su programa. Y no necesitarían tener todo tipo de configuraciones complicadas para ser finos.
Las distribuciones modernas de Linux, incluso las que todavía usan init.d, tienen una gran colección de funciones prefabricadas destinadas a facilitar la administración de demonios. Los procesos de arranque gráficos aprovechan esas funciones para mantener el bonito logotipo a menos que uno de los scripts de inicio comience a arrojar errores. Su código Python (o cualquier otro idioma) puede no funcionar bien con esos esquemas.
Si no te importa la estética o la facilidad de mantenimiento, tu script de inicio se puede escribir como quieras. He visto muchos administradores, que ni siquiera pueden cortar y pegar correctamente, ignoran por completo los argumentos de la línea de comandos y simplemente inician el demonio. Sin apagado, estado o reinicio. Era inmaduro, pero su código seguía funcionando.
Digo entre # 1-2. El LSB lo dirige de esta manera ... y desde un Sys-Admin (rol no dev), los requisitos del trabajo dictan el conocimiento sh / bash, NO el nivel de desarrollo (o incluso la comprensión ligera) de python, PHP o perl. Eso es para la pila LAMP, no para los scripts de inicio del sistema.
No veo ningún problema con esto, si sabe, con seguridad, que el intérprete de Python estará disponible cuando se ejecute el script init.d. Esto, para mí, indica que estás viendo algo que se está haciendo relativamente tarde en un nivel de ejecución multiusuario (o "consola gráfica").
Sin embargo ... Esto significa que una versión específica del intérprete de Python PUEDE ser vital para su secuencia de arranque y esta es una cosa más que debe verificar en las actualizaciones.
Supongo que esto significa que estoy diciendo "3. OK, con advertencias".
fuente
Estoy de acuerdo con "3. OK, con advertencias", pero por diferentes razones. Mi experiencia en Solaris fue que tenían una copia del sistema operativo de Perl para algunos de sus programas internos. El script de shell no era más que el shell para que el Perl comenzara. ¿El guión de inicio tenía que estar escrito en sh? No, pero mejoró la mantenibilidad para el administrador. Y el guión de inicio no hizo nada más complicado que cosas como
daemon --start
odaemon --stop
. Si hiciera esto, los usuarios habituales podrían iniciar su herramienta en modo no privilegiado, si eso tiene sentido en el contexto de su programa. Y no necesitarían tener todo tipo de configuraciones complicadas para ser finos.Las distribuciones modernas de Linux, incluso las que todavía usan
init.d
, tienen una gran colección de funciones prefabricadas destinadas a facilitar la administración de demonios. Los procesos de arranque gráficos aprovechan esas funciones para mantener el bonito logotipo a menos que uno de los scripts de inicio comience a arrojar errores. Su código Python (o cualquier otro idioma) puede no funcionar bien con esos esquemas.Si no te importa la estética o la facilidad de mantenimiento, tu script de inicio se puede escribir como quieras. He visto muchos administradores, que ni siquiera pueden cortar y pegar correctamente, ignoran por completo los argumentos de la línea de comandos y simplemente inician el demonio. Sin apagado, estado o reinicio. Era inmaduro, pero su código seguía funcionando.
fuente
Digo entre # 1-2. El LSB lo dirige de esta manera ... y desde un Sys-Admin (rol no dev), los requisitos del trabajo dictan el conocimiento sh / bash, NO el nivel de desarrollo (o incluso la comprensión ligera) de python, PHP o perl. Eso es para la pila LAMP, no para los scripts de inicio del sistema.
fuente