Usa systemd para instalar servicios en el corazón de Linux~

imagen

Original: Miss Sister Taste (ID de cuenta pública de WeChat: xjjdog), bienvenido a compartir, guarde esta información para reimprimirla.

Linux es muy seguro, confiable y huele como una chica morena, lo que significa que también es suave.

Ejecutar un servicio en Linux es tan tranquilizador como que un niño esconde ropa de mujer en una caja de seguridad. Su estabilidad y seguridad pueden hacer que las personas duerman cómodamente.

SPOF, es el famoso problema de punto único. Dado que xjjdog odia mostrar las características de las abreviaturas, escribí su nombre completo aquí: punto único de falla.

Un Linux es un solo Linux, por lo que los servicios que se ejecutan en él tendrán un único punto de problemas. La resolución de problemas de un solo punto generalmente se puede hacer a través de clústeres, pero también a través del lujo de los nodos de sombra.

Pero no importa cómo lo hagamos, todos esperamos que cierto proceso que se ejecuta en Linux pueda iniciarse automáticamente cuando se inicia Linux y cerrarse automáticamente cuando se apaga Linux. Queremos que nuestras aplicaciones, como la carne y hueso de Linux, se instalen en el corazón de Linux.

procedimiento de preparación

Durante mucho tiempo, solía supervisorhacer este tipo de cosas. Pero desafortunadamente, supervisor no es un software preinstalado de Linux, está escrito en python y necesita instalar muchos paquetes de dependencia. En un entorno empresarial donde los permisos de red se ajustan gradualmente, el uso de un supervisor se sumará a sus problemas.

Sí, no es que el supervisor sea malo, es que es demasiado engorroso. Las solicitudes frecuentes de permisos de red pueden ser frustrantes e incluso abrumadoras.

La siguiente mejor cosa es systemd.

imagen

Para ilustrar cómo usarlo, preparamos un pequeño programa Java.

import com.sun.net.httpserver.HttpContext;
import com.sun.net.httpserver.HttpServer;

import java.io.OutputStream;
import java.net.InetSocketAddress;

public class Runner {
    public static void main(String[] args) throws Exception{
        HttpServer server = HttpServer.create(new InetSocketAddress(14000), 0);
        HttpContext context = server.createContext("/");
        context.setHandler(exchange -> {
            try {
                String response = "Ojbk!";
                exchange.sendResponseHeaders(200, response.getBytes().length);
                OutputStream os = exchange.getResponseBody();
                os.write(response.getBytes());
                os.close();
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        });
        server.start();
    }
}

Este código iniciará un servidor Http en el puerto 14000, y cada vez que acceda a él, generará Ojbk. .

curl http://localhost:14000

Convertir el programa en un servicio

Para que el programa anterior forme parte del sistema, es necesario repararlo.

[Unit]
Description=My First Java Service
After=network.target
StartLimitIntervalSec=0
[Service]
Type=simple
Restart=always
RestartSec=1
User=root
ExecStart=/usr/bin/env java /opt/Runner

[Install]
WantedBy=multi-user.target

Lo más importante es ExecStart, que configura el comando exacto que desea ejecutar. Por supuesto, aquí somos un archivo de clase simple.

Asigne un nombre al archivo, por ejemplo xjjdogfirstjava.service, y coloque el archivo en el /etc/systemd/system/directorio.

Para iniciar este servicio, simplemente ejecute el siguiente comando directamente.

systemctl start xjjdogfirstjava

Si no puede encontrar el servicio que acaba de crear, recuerde volver a cargarlo.

systemctl daemon-reload

Si desea que comience con Linux, puede ejecutar enable para crear un enlace.

systemctl enable xjjdogfirstjava

Además de estos dos, desactivar, detener y reiniciar también son comandos estándar.

Observe que hay 2 líneas en el archivo de configuración.

Restart=always
RestartSec=1

Muestra que cada vez que el programa termina de manera anormal, el proceso se reiniciará automáticamente y el intervalo de reinicio es de 1 segundo.

alguna configuracion mas

Notamos que en el archivo de configuración anterior, hay After=network.targetpalabras. Indica que el servicio xjjdogfirstjava se iniciará solo cuando se inicie MySQL, es decir, se fuerza la especificación de una dependencia.

Sin embargo, cuando muchos socios pequeños usan la configuración anterior, a menudo descubren que después de que el servicio se reinicia automáticamente varias veces, nunca se reinicia nuevamente.

Espera, ¿no usamos el parámetro Restart=always?

Esto se debe al hecho de que systemd tiene dos umbrales integrados de forma predeterminada.

StartLimitBurst=5 
StartLimitIntervalSec=10

Cuando establece StartLimitIntervalSec en 0, finalmente se logra el propósito y nuestro programa siempre puede fallar y reiniciar todo el tiempo.

No obstante, es una buena práctica mantener un intervalo de reinicio. Porque cuando se reinician la mayoría de los servicios, se producirá un aumento en los recursos del servidor. Si no desea que su servidor emita una alarma, no lo oprima.

Final

Este es systemd, un programa integrado en Linux. Con él, sus aplicaciones finalmente pueden integrarse con Linux, y el tiempo pasa.

Sobre la autora: Miss Sister Taste (xjjdog), una cuenta pública que no permite a los programadores tomar desvíos. Centrarse en la infraestructura y Linux. Diez años de arquitectura, decenas de miles de millones de tráfico diario, discutiendo contigo el mundo de la alta concurrencia, brindándote un gusto diferente. Mi WeChat personal xjjdog0, bienvenido a agregar amigos para una mayor comunicación.

Lectura recomendada:

1. Juega Linux
2. Álbum Qué Sabor

3. bluetooth como un sueño
4. ¡Asesinato!
5. Arquitecto desconectado, dejando solo un guión
6. El BUG escrito por el arquitecto es inusual
7. ¡Algunos programadores son esencialmente un rebaño de ovejas!

Señorita hermana gusto

No envidies a los patos mandarines ni a los inmortales, solo ajusta una línea de código durante mucho tiempo.

346 contenido original

Supongo que te gusta

Origin juejin.im/post/7122035749473648671
Recomendado
Clasificación