Como faço para converter um script sysv-init em um trabalho do Upstart?

2

Gostaria de converter o script de inicialização do servidor slapd LDAP para um serviço Upstart. No entanto, tenho muito pouco conhecimento de scripts de inicialização do SysV (e do material do LSB (?)). Especificamente, estou interessado na capacidade respawn do Upstart.

O script slapd init do Ubuntu 14.04 é aqui . O serviço Upstart que eu criei é aqui .

Migrei coisas suficientes do script sysv? Eu cometi erros? Coisas que eu não entendi do script sysv, não incluí no trabalho do Upstart. Alguém poderia explicar este script de init sysv para mim?

Os arquivos relevantes são publicados em GitHub .

Antecedentes:

Eu tenho alguns servidores LDAP em N-way multi-mestre replicação . Há um bug conhecido que pode estar causando vazamentos de memória, levando aos daemons slapd ocasionalmente vítima do assassino de OOM.

Minhas opções incluem:

  1. Obtendo slapd para respawn (o assunto dessa pergunta).
  2. Usando uma versão mais nova do OpenLDAP (provavelmente compilada da origem).
  3. Arremessando mais RAM no servidor.
por muru 12.09.2014 / 23:56

2 respostas

1

Eu escrevi um aqui: link

Alguns erros que você cometeu:

  • Não deve haver - entre o slapd e suas opções.
  • O início dos eventos precisa ter um and entre eles.
  • sistemas de arquivos virtuais devem mudar para o sistema de arquivos, como disse Letizia.
por CameronNemo 14.09.2014 / 20:50
1

Palavra-chave da LSB

De acordo com LSBInitScripts :

 $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. 

enquanto de acordo com a página de manual sistemas de arquivos remotos :

 When it occurs, local filesystems such as /usr may not be mounted.  
 For most normal services the  filesystem(7)  event  is sufficient.

Você deve alterar os sistemas de arquivos remotos com o evento do sistema de arquivos que:

 The  filesystem  event  is generated by the mountall(8) daemon after it
 has mounted all filesystems listed in fstab(5).

Robustez

Verificação do script de inicialização do SystemV $SLAPD_CONF . Se não estiver presente nenhum tipo de configuração, o script não iniciará e parará com a saída 0 sem fazer nada.

Esta verificação é útil em caso de reinicialização entre a fase de instalação e a fase de configuração ou durante o procedimento de desinstalação. Para entender seu significado, você deve analisar os scripts prerm e postrm em /var/lib/dpkg/info .

Por exemplo, prerm tenta parar slapd e, se falhar, o procedimento unistall também falhará. O procedimento para parar sem o arquivo de configuração retornará 0 para permitir a desinstalação do pacote OpenLDAP que está instalado, mas não configurado.

A função check_for_no_start() impede a execução inicial com base na variável $ SLAPD_NO_START ou se o arquivo $ SLAPD_SENTINEL_FILE existir. Esta é uma maneira simples de desativar temporariamente a inicialização de slapd , para exemplos de manutenção. Mesmo se o servidor for reinicializado, slapd não será iniciado.

Funcionalidade

Script SystemV cria $piddir (se não existe) e dá permissão para $SLAPD_PIDFILE , isso é necessário porque slapd vai escrever pid em $SLAPD_PIDFILE .

Você deve adicionar isso no script pre_start .

De acordo com a página man do start-stop-daemon :

    -S, --start [--] arguments
              Check  for  the  existence  of  a  specified process.  If such a
              process exists, start-stop-daemon does nothing, and  exits  with
              error  status 1 (0 if --oknodo is specified).  If such a process
              does  not  exist,  it  starts  an  instance,  using  either  the
              executable  specified  by --exec or, if specified, by --startas.
              Any arguments given after -- on  the  command  line  are  passed
              unmodified to the program being started.

É por isso que você deve remover o comando -- no slapd como o CameronNemo disse.

Finalmente, quando parar, há a opção --retry TERM/10 que significa:

          schedule is a list of at least two items  separated  by  slashes
          (/);  each  item  may be -signal-number or [-]signal-name, which
          means to send that signal, or timeout, which means to wait  that
          many  seconds  for processes to exit, or forever, which means to
          repeat the rest of the schedule forever if necessary.

Eu acho que o OpendLDAP precisa de um pouco de tempo para desligar, então você deve adicionar a sub-rotina kill timeout 10 , que esperará 10 segundos (em relação ao padrão 5) para enviar slapd o SIGKILL .

    
por Lety 15.09.2014 / 01:24