É possível executar um script como primeiro no shutdown / reboot no Debian?

5

No momento, estou tentando registrar um script (localizado em /etc/init.d) de forma que esse script seja executado como o primeiro script / programa em shutdown / reboot (mude para o nível 0 ou 6) .

Eu usei update-rc.d stop_servers stop 0 0 6 . para registrar o script para esses dois níveis de execução. Está registrado corretamente, mas tem o nome K01stop_servers . Isso faz com que o script não seja executado como o primeiro.
Eu basicamente preciso de tudo ainda em execução. É por isso que quero que seja o primeiro. Ou seja, eu ainda preciso dos meus servidores ftp, mysql e (s) ftp em execução e meu java ainda estar totalmente funcional.

Como faço para isso?

O script é o seguinte:

#! /bin/bash

### BEGIN INIT INFO
# Provides:          mc_server_safe_shutdown
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:
# Default-Stop:      0 6
# Description:       Shuts down all Minecraft serves softly
### END INIT INFO

/root/.stop_servers

exit 0
    
por BrainStone 04.01.2014 / 20:43

2 respostas

1

A maneira correta de fazer o que você quer fazer é criar um script de init personalizado que lista as dependências necessárias. Dentro desse script, você inicia / interrompe o serviço em questão, dependendo se o script é chamado com start ou stop como o primeiro parâmetro.

Você pode começar com um script simples como /etc/init.d/motd como modelo, pois ele terá todas as partes básicas para que tudo funcione. No seu caso, você quer que o script indique

# Required-Stop: $remote_fs $syslog apache2 mysql

porque você precisa das instalações remote_fs e syslog em execução (mas não se importa com o serviço exato que fornece esses recursos) e, especificamente, apache2 e mysql serviços em execução, no momento em que a ação de parada é emitida. Observe que o Java não é um serviço em si, mas usá-lo pode ter dependências em serviços, incluindo sistemas de arquivos.

Should-Stop e Required-Stop são descritos na página man insserv (8) como:

In both cases the script system should avoid stopping services which are declared by these two Stop tags until the script including these tags is stopped.

Os nomes são de Provides (nomes de serviço literais, nenhum sinal $ no início) de scripts init de serviço e de /etc/insserv.conf (nomes de instalações, $ assinam no início).

Quando você tiver o script como quiser, instale-o usando update-rc.d ou diretamente usando insserv .

    
por 05.01.2014 / 16:37
3

Se você deseja executar um script apenas no desligamento, não é necessário:

# Required-Start:    $remote_fs $syslog

Você pode deixar isso em branco.

Cada script tem Provides entry, que define nomes de outros scripts que você pode usar nas diretivas Required-Start e Required-Stop . A ordem é invertida nos dois campos. Se algo precisa ser iniciado antes do script, você deve colocá-lo na diretiva Required-Start . Mas se o script tiver que parar antes de um determinado serviço, o nome desse serviço deve ser colocado em Required-Stop .

Assim, no seu exemplo, você deseja executar o script antes do apache e do mysql no encerramento. Tudo o que você precisa fazer é verificar a diretiva Provides nos arquivos init apropriados.

$ cat /etc/init.d/apache2
...
# Provides:          apache2
...

e:

$ cat /etc/init.d/mysql
...
# Provides:          mysql
...

Agora, adicione apenas apache2 e mysql ao seu script na diretiva Required-Stop :

# Required-Stop: apache2 mysql

Você pode ler mais sobre o cabeçalho de um script de inicialização aqui . Há também algumas informações sobre os nomes dos recursos, por exemplo, os mencionados $remote_fs e $syslog :

$local_fs -- all local filesystems are mounted. All scripts that write in /var/ need to depend on this, unless they already depend on $remote_fs.

$network -- low level networking (ethernet card; may imply PCMCIA running)

$named -- daemons which may provide hostname resolution (if present) are running. For example, daemons to query DNS, NIS+, or LDAP.

$portmap -- daemons providing SunRPC/ONCRPC portmapping service as defined in RFC 1833 (if present) are running all remote

$remote_fs -- all filesystems are mounted. In some LSB run-time environments, filesystems such as /usr may be remote. If the script need a mounted /usr/, it needs to depend on $remote_fs. Scripts depending on $remote_fs do not need to depend on $local_fs. During shutdown, scripts that need to run before sendsigs kills all processes should depend on $remote_fs.

$syslog -- system logger is operational

$time -- the system time has been set, for example by using a network-based time program such as ntp or rdate, or via the hardware Real Time Clock. Note that just depending on ntp will not result in an accurate time just after ntp started. It usually takes minutes until ntp actually adjusts the time. Also note that standard insserv.conf just lists hwclock as $time.

$all -- facility supported by insserv to start a script after all the other scripts, at the end of the boot sequence. This only work for start ordering, not stop ordering. It is not possible to depend on a script which depend on $all.

Depois de alterar um cabeçalho em um script de inicialização, você precisa executar update-rc.d e definirá a ordem correta de todos os scripts com base em seus cabeçalhos:

# update-rc.d script defaults 
    
por 05.01.2014 / 07:44