Como depurar o antigo script initd no systemd?

5

Eu tenho um script initd mais antigo para iniciar meu aplicativo. Funcionou bem em versões mais antigas do SuSE, mas falha no Open SuSE 12.3.

O estranho é

cd /etc/init.d ; ./script start

funciona bem.

/etc/init.d/script start

mostra um redirecionamento para systemctl, mas não inicia meu aplicativo (e também não mostra nenhuma saída do script initd).

Não vejo entradas de log mostrando o que deu errado. A única entrada que vejo está em / var / log / messages dizendo que o aplicativo foi iniciado.

Como depuro isso?

    
por Gene Vincent 28.10.2013 / 15:01

3 respostas

1

A razão pela qual o script tem esse comportamento é que o OpenSuse 12.3 substituiu o antigo sysvinit pelo systemd, um daemon de gerenciamento do sistema que controla todo o processo de inicialização.

O formato do script que descreve os serviços a serem iniciados pelo systemd difere daquele do sysvinit, portanto não é de admirar que o seu script falhe. Uma vez que o script esteja configurado corretamente, sua operação via systemctl é trivial:

sudo systemctl enable/disable your-service

ativa ou desativa, e normalmente

sudo systemctl start/stop/status your-service

inicia, pára, consultas depois de seu status.

Um script típico de serviço personalizado está localizado na pasta / etc / systemd / system, termina com o sufixo .service e possui este formato:

 [Unit]
 Description=sdbarker.com Chiliproject
 Requires=mysqld.service nginx.service
 Wants=mysqld.service nginx.service

 [Service]
 User=www-data
 WorkingDirectory=/path/to/chiliproject/install
 ExecStart=/usr/bin/bundle 
 PIDFile=/path/to/chiliproject/install/tmp/pids/server.pid

 [Install]
 WantedBy=multi-user.target

Como você pode ver, a maioria das entradas é auto-explicativa. Sem saber mais sobre o seu script, não posso fornecer mais assistência, mas você encontrará nesta página Wiki do Arch Linux as informações necessárias para escrever um script de serviço personalizado adequado.

    
por 28.10.2013 / 18:27
2

Algumas coisas.

  1. Execute o comando com um ambiente limpo:

    env -i PATH=/usr/sbin:/sbin:/usr/bin:/bin /etc/init.d/SCRIPT start
    
  2. Em segundo lugar, ative a depuração do shell. Uma maneira simples de fazer isso é com:

    bash -x SCRIPT start
    

combinando os dois, você tem:

    env -i PATH=/usr/sbin:/sbin:/usr/bin:/bin bash -x /etc/init.d/SCRIPT start
  1. Desative o modo de compatibilidade de systemd com:

    SYSTEMCTL_SKIP_REDIRECT=true
    

O nome dessa variável pode variar. Seu script de inicialização provavelmente inclui algo como

    . /etc/sysconfig/functions

Esse arquivo irá verificar a variável de ambiente acima. (Suse é um pouco diferente de seus primos baseados em RedHat, então YMMV).

Combinando todos os itens acima:

env -i PATH=/usr/sbin:/sbin:/usr/bin:/bin SYSTEMCTL_SKIP_REDIRECT=true  \
bash -x /etc/init.d/SCRIPT start

Por fim, como a saída será volumosa, acrescente o seguinte:

2>&1 | less -r +F

O programa less armazenará em buffer a saída, permitindo rolar para trás todo o histórico. Pressione CTRL-C para sair do modo "follow" para poder rolar de volta, etc.

    
por 04.10.2016 / 19:16
0

Provavelmente existe um caminho relativo dentro de /etc/init.d/script que não é relevante fora de /etc/init.d/. Você poderia colocar o conteúdo do script aqui (a menos que seja realmente enorme).

Certifique-se de que quaisquer argumentos enviados para o seu aplicativo não contenham caminhos relativos, pois o diretório de trabalho do aplicativo é aquele em que ele é iniciado.

    
por 28.10.2013 / 16:36