¿Cuál es la forma correcta de reiniciar los servicios dependientes durante la instalación del paquete?

10

Estoy creando un paquete de configuración y me gustaría detener y reiniciar los servicios cuya configuración se ve afectada. En este momento estoy usando el service [stop|restart]en {pre,post}{inst,rm}camino. Leí una pregunta en algún lugar que invoke-rc.des la forma correcta , porque respeta las preferencias del usuario sobre un servicio. Sin embargo, no pude encontrar ninguna guía sobre esto. ¿Alguien sabe de esas pautas? ¿O tiene algún consejo sobre la forma en que debo elegir? El paquete es de uso interno y es probable que solo sea por 14.04 durante los próximos dos años. Sin embargo, me gustaría dejar un estado lo más limpio posible para mi sucesor, también lo systemdtengo en mente.

Desde la invoke-rc.dpágina del manual :

Todo acceso a los scripts de inicio mediante los scripts de mantenimiento de los paquetes Debian debe hacerse a través de invoke-rc.d .

Del Manual de Políticas de Debian, Capítulo 9, Sección 3.3 :

Los encargados del mantenimiento deben usar la capa de abstracción proporcionada por los programas update-rc.d e invoke-rc.d para tratar los initscripts en los scripts de sus paquetes, como postinst, prerm y postrm.

...

Los scripts del mantenedor del paquete deben usar invoke-rc.d para invocar los initscripts /etc/init.d/*, en lugar de llamarlos directamente.

Debian ha estado usando sysv-inity cambiará directamente a systemd, y supongo que el manual de políticas se actualizará a su debido tiempo systemctl. Sin embargo, de lo que no estoy seguro es de esto: ¿Debo usar en invoke-rc.dlugar de service? Puedo decir dpkgque estoy interesado en algunos archivos (a través de disparadores), entonces, ¿hay alguna manera de decir dpkgque también estoy interesado en algunos servicios y dpkghacer el reinicio / recarga?

Para aclarar: no estoy escribiendo guiones de inicio. Estoy proporcionando un paquete con configuración para otras aplicaciones, como Puppet, NTP, etc., así que detengo y reinicio los servicios correspondientes en los scripts.

Aquí , por ejemplo, es una cuestión acerca del estibador invoke-rc.dvs service. El problema aún está abierto, con una persona, probablemente un mantenedor, comentando que definitivamente están interesados ​​en hacer esto de la manera correcta , claramente ninguno de nosotros está seguro de qué es eso. (Mi pregunta es independiente de ese problema).

muru
fuente

Respuestas:

5

Seguiría usando los scripts pre / post inst,

preinst: este script se ejecuta antes de que el paquete se desempaquete de su archivo de Debian (".deb"). Muchos scripts 'preinst' detienen los servicios para paquetes que se están actualizando hasta que se completa su instalación o actualización (luego de la ejecución exitosa del script 'postinst').

postinst: este script generalmente completa cualquier configuración requerida del paquete foo una vez que foo ha sido desempaquetado de su archivo de Debian (".deb"). A menudo, los scripts 'postinst' le piden al usuario su entrada y / o le advierten que si acepta los valores predeterminados, debe recordar volver y volver a configurar ese paquete según lo requiera la situación. Muchos scripts 'postinst' ejecutan los comandos necesarios para iniciar o reiniciar un servicio una vez que se ha instalado o actualizado un nuevo paquete.

ver - https://www.debian.org/doc/manuals/debian-faq/ch-pkg_basics.en.html

La sintaxis de invocar start | stop | restart se escribe como condicional, consulte https://www.debian.org/doc/debian-policy/ch-opersys.html sección 9.3.3.2 Ejecutar initscripts

si cual invoke-rc.d> / dev / null 2> & 1; luego

paquete invoke-rc.d

más

/etc/init.d/package

fi

entonces ...

if which service >/dev/null 2>&1; then
        service package <action>
elif which invoke-rc.d >/dev/null 2>&1; then
        invoke-rc.d package <action>
else
        /etc/init.d/package <action>
fi

y agregue otro condicional para systemd cuando sea necesario;)

Entonces, sí, la forma correcta de iniciar | detener | reiniciar un servicio es con el script de envoltura apropiado (invoke-rc.d / system), cuando sea posible, en lugar de llamar al script de inicio (/etc/init.d/package) y recurriendo al script /etc/init.d cuando no hay ningún contenedor disponible.

Pantera
fuente
Eso responde a la mayoría de mis dudas, excepto una. La invoke-rc.dpágina del manual y los documentos de la política de Debian nos dicen que lo usemos en conexión con los /etc/init.d/scripts (posiblemente porque todavía usaban sysv-init). ¿Cómo cambia eso con Upstart o systemd?
muru
Actualice su pregunta o publique un enlace a la información que está leyendo. No vi nada en la página del manual sobre empaque. Supongo que depende de su servicio y el guión de inicio (¿es advenedizo? Systemd?) Usted está pidiendo en askubuntu.com, y Ubuntu usa advenedizo, por lo askubuntu.com/questions/58404/how-to-start-and-stop -un servicio . Si su paquete usa una secuencia de comandos de inicio antigua, debería convertirse a upstart por ahora y systemd a largo plazo.
Pantera
He actualizado la pregunta.
muru
No hay una respuesta fácil o única para la pregunta, ya que "depende". Esta es una situación un poco temporal, ya que avanzar Ubuntu y Debian usarán systemd. Debería usar invoke-rc.d para servicios en Debian (o Ubuntu) que usan sysv-init y service ... en Ubuntu para servicios que usan upstart. Es una secuencia de comandos, así que sea creativo si es necesarioinvoke-rc.d ... || service ...
Panther
Pensé que estabas preguntando si deberías usar los scripts pre / post inst, no la sintaxis de tu script.
Panther
0

Una mejor manera para los sistemas systemd es usar deb-systemd-invoke .

Razvan Grigore
fuente
1
Proporcione más información sobre cómo usarlo deb-systemd-invoke.
Cynplytholowazy