10.16.2015

Gestão de serviços com o systemctl

Nas últimas versões RHEL/CentOS/Fedora a inicialização do sistema e os processos passaram a ser geridos pelo systemd System e pelo Service Manager.

Relembrando, os deamons são processos que correm em segundo plano e que podem efectuar as mais variadas tarefas. Geralmente são inicializados com o sistema e permanecem em execução até serem forçados pelo administrador a terminarem. Por convenção, a maioria dos deamons começam por "d."

Durante muitos anos, o processo (process ID 1) do Linux foi o conhecido init, que tomava a responsabilidade pela activação de quase todos os processos. Os deamons eram inicializados durante o arranque do sistema (boot) através de shell scripts System V e LSB. Em menor número, alguns deamons eram controlados por processos como o initd ou o xinetd, nomeadamente para serviços que podiam receber ligações por parte de clientes e que só nessa circunstância eram activados. Esta implementação tinha insuficiências que foram debeladas pelo systemd. O novo sistema permite melhor performance do arranque, melhor gestão de dependências entre serviços e melhor capacidade de gerir processos em simultâneo.

Com a implementação do systemd, as shell-scipts são apenas usadas para alguns serviços de uso descontinuado mas que ainda são necessários. Como tal, os ficheiros de configuração como os encontrados na directoria /etc/sysconfig estão a ser substituídos.

O comando de gestão dos processos e serviços do sistema passa a ser o systemctl. Na nova abordagem este programa gere diferentes tipos de objectos que se designam na documentação por units. A lista de units pode ser consultada com o comando:

[root@CentOSCLI ~]# systemctl -t help
Available unit types:
service
socket
target
device
mount
automount
snapshot
timer
swap
path
slice
scope

Os serviços (units) com uma extensão .service representam serviços do sistema, sendo geralmente deamons manipulados com frequência (ex: servidor web).

Os sockets possuem uma extensão .socket que representam sockets IPC (inter-process communication). O controlo deste tipo de unit é passado para um deamon apenas quando é necessário. Não são inicializados durante o arranque. Ou seja,os princípios inerentes ao xinetd são aqui aplicados.

A extensão .path é utilizada quando ocorre uma mudança no file system que suscita a activação de um determinado serviço. Este tipo de implementação foi pensada principalmente para serviços de impressão.

O estado (state) pode ser verificado com o comando:

[root@CentOSCLI ~]# systemctl status sshd
sshd.service - OpenSSH server daemon
Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled)
Active: active (running) since Seg 2015-10-12 11:05:40 WEST; 23h ago
Main PID: 1208 (sshd)
CGroup: /system.slice/sshd.service
.......

Vários estados possíveis

Estado Descrição
 
loaded ficheiro de cofiguração da respectiva unit processado
active (running) Em execução
active (exit) Configuração efectuada com sucesso
active (waiting) Em execução, à espera de um evento
inactive Não está em execução
enabled Serviço será inicializado com o arranque do sistema
disabled Serviço não será inicializado com o arranque do sistema
static Só pode ser activado por outra unit.

(Nota: Não esquecer que com o systemd devemos colocar [systemctl status name] ao contrário de service name status. Ou seja systemctl status sshd e não service sshd status)

O comando systemctl sem argumentos permite listar todas as "units" do sistema. Automaticamente o output é gerado com o comando less.

[root@CentOSCLI ~]# systemctl

  UNIT                        LOAD   ACTIVE SUB       DESCRIPTION
proc-sys...t_misc.automount loaded active waiting Arbitrary Executable File Fo
sys-devi...block-sr0.device loaded active plugged VBOX_CD-ROM
sys-devi...et-enp0s3.device loaded active plugged PRO/1000 MT Desktop Adapter
sys-devi...-sda-sda1.device loaded active plugged VBOX_HARDDISK
sys-devi...-sda-sda2.device loaded active plugged LVM PV
sys-devi...block-sda.device loaded active plugged VBOX_HARDDISK
sys-devi...tty-ttyS0.device loaded active plugged /sys/devices/platform/serial

(outuput suprimido)

.......

Verificar apenas o estado de units do tipo service:

  [root@CentOSCLI ~]# systemctl --type=service
UNIT LOAD ACTIVE SUB DESCRIPTION
auditd.service loaded active running Security Auditing avahi-daemon.service loaded active running Avahi mDNS/DNS-SD crond.service loaded active running Command Scheduler dbus.service loaded active running D-Bus System Message firewalld.service loaded active running firewalld getty@tty1.service loaded active running Getty on tty1 ..... .... (output suprimido)

Analogamente usam-se os comandos systemctl --type=path ou systemctl --type=socket para units com extensão .path e extensão .socket

Para verificar se um serviço está activo

[root@CentOSCLI ~]#systemctl is -active sshd
enabled

Para verificar se um serviço é inicilizado no arranque do sistema.

[root@CentOSCLI ~]#systemctl is -enabled sshd
enabled

Verifica o estado das units (tipo service).

  [root@CentOSCLI ~]# systemctl list-unit-files --type=service
UNIT FILE STATE
auditd.service enabled
autovt@.service disabled
avahi-daemon.service enabled
blk-availability.service disabled
brandbot.service static
console-getty.service disabled
console-shell.service disabled
...... output suprimido
Lista serviços cuja inicialização falhou: [root@CentOSCLI ~]# systemctl --failed --type=service
UNIT LOAD ACTIVE SUB DESCRIPTION
kdump.service loaded failed failed Crash recovery kernel arming Sem parar o serviço, recarrega as configurações [root@CentOSCLI ~]# systemctl reload sshd Pára o serviço

[root@CentOSCLI ~]# systemctl stop sshd

Iniciar o serviço

[root@CentOSCLI ~]# systemctl start sshd

Existem situações em que serviços incompatíveis não devem estar simultaneamente em execução (ex: iptables e firewalld). Pode-se impedir que um administrador arranque um determinado serviço, mascarando o mesmo (mask a service). Basicamente o ficheiro de configuração é modificado de modo a que o serviço não arranque. (manualmente ou durante a inicialização do sistema operativo).

[root@CentOSCLI ~]# systemctl mask network
ln -s '/dev/null' '/etc/systemd/system/network.service'

Para reverter a alteração

[root@CentOSCLI ~]# systemctl unmask network
rm '/etc/systemd/system/network.service'

Tabela de referência com os comandos mais comuns

Tarefa Comando
 
Ver informação detalhada systemctl status UNIT
Pára um serviço systemctl status UNIT
Iniciar um serviço systemctl start UNIT
Reeiniciar um serviço systemctl restart UNIT
Recarregar a configuração (não pára o serviço) systemctl reload UNIT
Desactivar a possibilide de um serviço ser executado systemctl mask UNIT
Activar um serviço para ser executado no arranque do sistema systemctl enable UNIT
Desactivar um serviço, impossibilitando-o de ser executado no arranque do sistema systemctl disable UNIT
Listar dependências systemctl list-dependencies UNIT

Fonte: Ebook: Red Hat 7.0 Trainning - System Administration.