Servicios, servicios, servicios. Un servicio es una gran parte de la informática. Estás leyendo este artículo sobre un servicio. Su computadora está ejecutando servicios. Internet está lleno de ellos.
Acerca de systemctl
En Linux, la forma estándar de ejecutar y administrar servicios es a través de la utilidad systemd y el comando systemctl
. Su uso es bastante simple:solo necesita saber el nombre del servicio que desea administrar, luego puede usar este comando para iniciar o detener el servicio, verificar su estado o realizar otras funciones:
# systemctl start httpd
# systemctl stop httpd
# systemctl status httpd
Archivos de unidad
Un servicio se define en un archivo llamado archivo de unidad. Generalmente se encuentran en el directorio /usr/lib/systemd/system
. Aquí hay una lista de muestra:
# ls /usr/lib/systemd/system
auditd.service multi-user.target sys-kernel-debug.mount
[email protected] multi-user.target.wants sys-kernel-tracing.mount
basic.target NetworkManager-dispatcher.service syslog.socket
basic.target.wants NetworkManager.service syslog.target.wants
blk-availability.service NetworkManager-wait-online.service
A veces, necesita ejecutar más de una instancia de un servicio en un solo host. Por ejemplo, si mantiene sitios web para varios clientes, las normas de seguridad exigen que cada cliente tenga su propia instancia individual. Esto significa que necesita ejecutar un nuevo servicio Apache HTTP para cada uno, pero tener muchos servicios puede ser difícil de administrar. Si tiene 10 clientes diferentes, tendría que crear 10 archivos de unidad separados para administrarlos. Afortunadamente, existe una forma mejor de gestionar varias instancias de un servicio.
El símbolo @
Tenga en cuenta que algunos de los archivos de unidad tienen un símbolo @ en su nombre. Este símbolo tiene un significado interesante. De hecho, después de instalar Apache HTTP Server, es posible que observe varios archivos de unidades de servicio, incluido uno que tiene el símbolo @ en su nombre:[email protected]
.
Le mostraré cómo esto puede hacer que la vida de un administrador de sistemas sea un poco más fácil, utilizando el servidor Apache HTTP para este ejemplo:
# dnf -y install httpd
# cd /usr/lib/systemd/system
# ls -d http*
httpd.service [email protected] httpd.service.d httpd.socket httpd.socket.d
El símbolo @ indica que se realizará una sustitución. Systemd tomará lo que escriba después y reemplazará la variable %i
dentro del archivo de la unidad de servicio. La variable se puede ver en este extracto del [email protected]
archivo:
[Unit]
Description=The Apache HTTP Server
After=network.target remote-fs.target nss-lookup.target
Documentation=man:[email protected](8)
[Service]
Type=notify
Environment=LANG=C
Environment=HTTPD_INSTANCE=%i
ExecStartPre=/bin/mkdir -m 710 -p /run/httpd/instance-%i
ExecStartPre=/bin/chown root.apache /run/httpd/instance-%i
ExecStartPre=/bin/mkdir -m 700 -p /var/lib/httpd/instance-%i
ExecStartPre=/bin/chown apache.apache /var/lib/httpd/instance-%i
ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND -f conf/%i.conf
ExecReload=/usr/sbin/httpd $OPTIONS -k graceful -f conf/%i.conf
Tenga en cuenta que el archivo de unidad httpd predeterminado, httpd.service
, no tiene el símbolo @ en su nombre y se ve diferente. Se utiliza para una única instancia predeterminada básica del servidor Apache HTTP.
Ejecutar varias instancias
Más sobre administradores de sistemas
- Habilitar el blog de administrador del sistema
- La empresa automatizada:una guía para administrar TI con automatización
- Libro electrónico:Automatización de Ansible para administradores de sistemas
- Historias del campo:una guía del administrador de sistemas para la automatización de TI
- eBook:Una guía de Kubernetes para SRE y administradores de sistemas
- Últimos artículos de administrador de sistemas
Para ejecutar múltiples instancias usando este archivo de unidad especial, cada una necesita un nombre único. Suponga que tiene dos clientes, The Little Bank y The Big Bank. Nombra las instancias littlebank y bigbank. Para administrar uno, simplemente agregue su nombre después del símbolo @. Inicie cada instancia con el comando apropiado:
- littlebank:
systemctl start httpd@littlebank
- bigbank:
systemctl start httpd@bigbank
Tenga en cuenta que la mayoría de los servicios necesitan ciertas configuraciones para evitar conflictos entre diferentes instancias. No los cubriré todos aquí, pero Apache necesita varias cosas, incluidos números de puerto de escucha únicos, archivos PID y raíces de documentos.
Lo demostraré intentando iniciar la instancia de littlebank. Espero que falle, pero proporcionará un mensaje de estado útil:
# systemctl start httpd@littlebank
# systemctl status httpd@littlebank
● [email protected] - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/[email protected]; disabled; vendor preset: disabled)
Active: failed (Result: exit-code) since Tue 2020-11-10 11:41:20 EST; 1min 58s ago
Docs: man:[email protected](8)
Process: 2205 ExecStartPre=/bin/mkdir -m 710 -p /run/httpd/instance-littlebank (code=exited, status=0/SUCCESS)
Process: 2207 ExecStartPre=/bin/chown root.apache /run/httpd/instance-littlebank (code=exited, status=0/SUCCESS)
Process: 2208 ExecStartPre=/bin/mkdir -m 700 -p /var/lib/httpd/instance-littlebank (code=exited, status=0/SUCCESS)
Process: 2209 ExecStartPre=/bin/chown apache.apache /var/lib/httpd/instance-littlebank (code=exited, status=0/SUCCESS)
Process: 2210 ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND -f conf/littlebank.conf (code=exited, status=1/FAILURE)
Main PID: 2210 (code=exited, status=1/FAILURE)
CPU: 26ms
Nov 10 11:41:20 localhost.localdomain systemd[1]: Starting The Apache HTTP Server...
Nov 10 11:41:20 localhost.localdomain httpd[2210]: httpd: Could not open configuration file /etc/httpd/conf/littlebank.conf>
Nov 10 11:41:20 localhost.localdomain systemd[1]: [email protected]: Main process exited, code=exited, status=1/FAIL>
Nov 10 11:41:20 localhost.localdomain systemd[1]: [email protected]: Failed with result 'exit-code'.
Nov 10 11:41:20 localhost.localdomain systemd[1]: Failed to start The Apache HTTP Server.
Puede ver que systemd sustituye correctamente el nombre de la instancia en lugar de %i
variable en el archivo de la unidad. Sin embargo, Apache no se inicia porque no pudo abrir un archivo de configuración. Entonces, ahora configuraré las instancias para incluir la creación de los archivos de configuración necesarios (littlebank.conf
y bigbank.conf
) en /etc/httpd/conf/
:
# ls /etc/httpd/conf
bigbank.conf httpd.conf littlebank.conf
Ahora puede administrar cada instancia con systemctl
. Problema start
y status
comandos a cada uno. He acortado el resultado a los detalles más relevantes:
# systemctl start httpd@bigbank
# systemctl start httpd@littlebank
# systemctl status httpd@bigbank
● [email protected] - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/[email protected]; disabled; vendor preset: disabled)
Active: active (running) since Tue 2020-11-10 12:26:06 EST; 56min ago
# systemctl status httpd@littlebank
● [email protected] - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/[email protected]; disabled; vendor preset: disabled)
Active: active (running) since Tue 2020-11-10 12:25:58 EST; 55min ago
Aquí está la vista de proceso de estas instancias. Hay más de uno porque Apache está bifurcando los procesos del servidor, lo que normalmente hace:
# pgrep -a httpd
2834 /usr/sbin/httpd -DFOREGROUND -f conf/littlebank.conf
2835 /usr/sbin/httpd -DFOREGROUND -f conf/littlebank.conf
2836 /usr/sbin/httpd -DFOREGROUND -f conf/littlebank.conf
3061 /usr/sbin/httpd -DFOREGROUND -f conf/bigbank.conf
3062 /usr/sbin/httpd -DFOREGROUND -f conf/bigbank.conf
3064 /usr/sbin/httpd -DFOREGROUND -f conf/bigbank.conf
Ponlo en uso
Esta pequeña característica de systemd es muy útil cuando necesita muchas instancias de un servicio. Espero que pueda darle un buen uso en su trabajo.