gerenciamento de daemon portátil do bash (sysvinit / upstart / systemd)

1

Eu tenho um pequeno script de shell que precisa parar um serviço. Isso precisa funcionar no Ubuntu (14.04), debian e Arch. Agora o que eu faço é semelhante ao

   case $(cat /etc/issue) in 
     *Ubuntu*)
       service command
     *Debian*)
       /etc/init.d/servicename command
     *Arch*)
       systemctl service command
   esac

Existe alguma maneira melhor de fazer isso?

    
por Dhananjay Balan 19.05.2014 / 13:58

4 respostas

5

Eu diria que não olhe para a atual distribuição para determinar qual sistema init usar para gerenciar daemons:

  • É um pouco nebuloso determinar uma distro (como descrito na resposta de Dennis)
  • o sistema init em uso muda entre as versões de uma distro (como Michael Hampton observou, as distribuições de grande nome estão gravitando em direção ao systemd; o Ubuntu é atualmente o grande nome e planeja mudar até 2016).
  • O sistema init pode ser alterado em uma instalação individual a partir do padrão (a partir de 14.10 Utopic Unicorn em outubro, algumas instalações do Ubuntu podem optar por alternar para o systemd antes do tempo).

Embora isso não seja infalível (um sistema pode optar por instalar vários sistemas init juntos), a maneira que eu faria seria procurar a presença das próprias ferramentas :

if command -v systemctl >/dev/null; then
  # assume systemd
  systemctl $command $servicename
elif command -v initctl >/dev/null; then
  # assume upstart
  initctl $command $servicename
elif command -v service >/dev/null; then
  # assume old Debian 'service' utility
  service $servicename $command

# ... elif cases for any other utils you'd want to check for ...

else
  # assume bare init.d scripts
  /etc/init.d/$servicename $command
fi

Esta resposta a uma pergunta semelhante descreve algumas outras heurísticas que você pode usar para determinar o sistema init atualmente em uso , para casos em que isso não é preciso o suficiente.

Em última análise, porém, não há uma maneira de realmente detectar qual sistema init uma instalação "usa" - é possível criar uma configuração que alterna entre os sistemas init toda vez que é inicializada.

    
por 27.08.2014 / 02:30
2

Eu não usaria o / etc / issue porque este arquivo às vezes é alterado ou pode nem mesmo mencionar a versão.

em vez disso, você deve, em minha opinião, pesquisar o arquivo específico da distribuição.

Por sua parte:

Debian: /etc/debian_version
Ubuntu: /etc/lsb-release
Arch: /etc/arch-release

pessoalmente eu iria verificar a existência do arquivo e "case" com base nesse arquivo

veja aqui alguns dos outros arquivos de distribuição

linuxmafia.com

    
por 19.05.2014 / 14:16
2

Se você tiver por aí por algum outro motivo, facter tem operatingsystem de fato que faria o que você quer.

    
por 19.05.2014 / 15:47
1

Tanto o Ubuntu quanto o Debian têm o utilitário de serviço. Use service servicname start|stop para tudo, menos para arco.

    
por 28.06.2014 / 13:47