3. Um script fictício

O script a seguir apenas emite uma mensagem toda vez que o sistema é inicializado:

#!/bin/sh1

. /etc/rc.subr2

name="dummy"3
start_cmd="${name}_start"4
stop_cmd=":"5

dummy_start()6
{
	echo "Nothing started."
}

load_rc_config $name7
run_rc_command "$1"8

Os pontos a serem observadas são:

1

Um script interpretado deve começar com a linha mágica shebang. Essa linha especifica o programa interpretador para o script. Devido a linha shebang, o script pode ser invocado exatamente como um programa binário, desde que tenha o bit de execução definido. (Veja chmod(1).) Por exemplo, um administrador do sistema pode executar nosso script manualmente, a partir da linha de comando:

# /etc/rc.d/dummy start

Nota:

Para ser adequadamente gerenciado pelo framework do rc.d, seus scripts precisam ser escritos na linguagem sh(1). Se você tiver um serviço ou port que use um utilitário de controle binário ou uma rotina de inicialização escrita em outra linguagem, instale este elemento em /usr/sbin (para o sistema) ou em /usr/local/sbin (para um port) e invoque-o por meio de um script sh(1) no diretório apropriado do rc.d.

Dica:

Caso você queira aprender os detalhes do porque os scripts rc.d devem ser escritos na linguagem sh(1), veja como o /etc/rc invoca-os por meio de run_rc_script, e então estude a implementação de run_rc_script em /etc/rc. subr.

2

Em /etc/rc.subr, várias funções sh(1) estão definidas para serem utilizadas por um script rc.d. As funções estão documentadas em rc.subr(8). Embora seja teoricamente possível escrever um script rc.d sem usar o rc.subr(8), as suas funções são extremamente úteis e tornam o trabalho mais fácil. Portanto, não é de surpreender que todos recorram a scripts rc.subr(8) em rc.d. Nós não vamos ser uma exceção.

Um script rc.d deve incluir o /etc/rc.subr (isto por ser feito usando o comando .) antes que ele chame as funções do rc.subr(8) para que o sh(1) tenha a oportunidade para aprender as funções. O estilo preferido é incluir o /etc/rc.subr antes de tudo.

Nota:

Algumas funções úteis relacionadas a rede são fornecidas por outro arquivo include, o /etc/network.subr.

3

A variável obrigatória name especifica o nome do nosso script. Ela é exigida pelo rc.subr(8). Ou seja, cada script rc.d deve definir a variável name antes de chamar funções do rc.subr(8).

Agora é o momento certo para escolher um nome exclusivo para o nosso script de uma vez por todas. Vamos usá-lo em vários lugares enquanto desenvolvemos o script. Para começar, também vamos dar o mesmo nome ao arquivo de script.

Nota:

O estilo atual do script rc.d é incluir valores atribuídos as variáveis entre aspas duplas. Tenha em mente que é apenas um problema de estilo que nem sempre pode ser aplicável. Você pode omitir com segurança as aspas das palavras simples sem os metacaracteres do sh(1) nelas, enquanto em certos casos você precisará de aspas simples para evitar qualquer interpretação do valor pelo sh(1). Um programador deve ser capaz de dizer a sintaxe da linguagem a partir das convenções de estilo e bem como de usá-las sabiamente.

4

A idéia principal por trás do rc.subr(8) é que um script rc.d fornece manipuladores, ou métodos, para o rc.subr(8) invocar. Em particular, start, stop e outros argumentos para um script rc.d são tratados desta maneira. Um método é uma expressão sh(1) armazenada em uma variável denominada argument_cmd, no qual argument corresponde ao que pode ser especificado na linha de comando do script. Vamos ver mais adiante como o rc.subr(8) fornece métodos default para os argumentos padrão.

Nota:

Para tornar o código em rc.d mais uniforme, é comum usar ${name} onde for apropriado. Assim, várias linhas podem ser copiadas de um script para outro.

5

Devemos ter em mente que o rc.subr(8) fornece métodos default para os argumentos padrões. Consequentemente, devemos sobrescrever um método default com uma expressão no-op sh() se desejarmos que ele não faça nada.

6

O corpo de um método sofisticado pode ser implementado como uma função. É uma boa ideia tornar o nome da função significativo.

Importante:

É altamente recomendado adicionar o prefixo ${name} aos nomes de todas as funções definidas em nosso script, para que eles nunca entrem em conflito com as funções do rc.subr(8) ou outro arquivo de inclusão comum.

7

Essa chamada ao rc.subr(8) carrega as variáveis do rc.conf(5). Nosso script não faz uso delas ainda, mas ainda assim é recomendado carregar o rc.conf(5) pois podem haver variáveis rc.conf(5) controlando o rc.subr(8) propriamente dito.

8

Geralmente este é o último comando em um script rc.d. Ele invoca o maquinário rc.subr(8) para executar a ação solicitada usando as variáveis e métodos que nosso script forneceu.

All FreeBSD documents are available for download at https://download.freebsd.org/ftp/doc/

Questions that are not answered by the documentation may be sent to <freebsd-questions@FreeBSD.org>.
Send questions about this document to <freebsd-doc@FreeBSD.org>.