Subindo serviços com /etc/rc.local como nos anos 80

Costumo usar o script /etc/rc.local para subir serviços rapidamente durante o boot. É conveniente, simples e funciona bem no Debian e em outras distribuições Linux. Basicamente, é apenas um script sh (ou o shell que você preferir) que é executado durante o boot.

Curiosamente, o rc.local é considerado obsoleto desde o lançamento do UNIX System III, em 1983!

Desde então, diversas tentativas foram feitas para descontinuar esse arquivo. Ele não é recomendado há muito tempo em favor de soluções mais modernas para iniciar serviços durante o boot, mas ainda persiste. Se o arquivo /etc/rc.local não existir no seu sistema, tente criá-lo e dar permissão de execução. Existe uma boa chance de o systemd reconhecer que você é totalmente old school e executar o rc.local normalmente durante o boot, inclusive esperando educadamente a rede ser ativada antes de rodá-lo (testado no Debian e no Ubuntu).

Por que usar o rc.local? Simplicidade. É apenas um script. Não é TOML, YAML, nem qualquer outro formato exótico de configuração. Sendo um script puro, permite que você faça qualquer tipo de hack que quiser.

Claro, ao utilizá-lo você abre mão de funcionalidades mais avançadas, como reinício automático e gerenciamento de dependências entre serviços.

O fato do rc.local ainda existir, mesmo sendo considerado obsoleto há mais de 40 anos, é prova de que simples sempre é melhor. Como diz o ditado: se não está quebrado, não conserte.

Abaixo está a configuração padrão do systemd que executa o rc.local durante o boot, tanto no Debian quanto no Ubuntu:

#  SPDX-License-Identifier: LGPL-2.1-or-later
#
#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.

# This unit gets pulled automatically into multi-user.target by
# systemd-rc-local-generator if /etc/rc.local is executable.
[Unit]
Description=/etc/rc.local Compatibility
Documentation=man:systemd-rc-local-generator(8)
ConditionFileIsExecutable=/etc/rc.local
After=network.target

[Service]
Type=forking
ExecStart=/etc/rc.local start
TimeoutSec=infinity
RemainAfterExit=yes
GuessMainPID=no

Ou seja, se o arquivo /etc/rc.local existir e for executável, o systemd irá automaticamente.

Por padrão, esse serviço envia apenas o parâmetro “start” para o script /etc/rc.local, mas você pode facilmente modificá-lo para aceitar outros parâmetros, como “stop”, deixando-o ainda mais próximo do clássico do SysV.

Cesar Gimenes

Última modificação
Tags: