Como você faz um serviço systemd como o último serviço na inicialização?

20

Há muitos anos, podemos escrever nosso script de inicialização em /etc/rc.local . Depois que todos os serviços do sistema forem carregados, seu script será executado.

Agora, usamos o systemd, não temos mais rc.local . O Systemd inicia o serviço paralelo. Você pode escrever seu próprio serviço para atuar em um rc.local ', mas você não pode garantir que ele será executado após todos os serviços do sistema serem carregados.

Existe uma maneira de fazer isso? Ou temos que usar Before e After no arquivo de serviço do systemd?

    
por 比尔盖子 31.01.2013 / 10:22

3 respostas

23

No systemd, é aconselhável usar Before = e After = para ordenar bem seus serviços em relação aos outros.

Mas desde que você pediu um jeito sem usar o Before and After, você pode usar:

Type=idle

que, como man systemd.service , explica

is very similar to simple, however actual execution of the service binary is delayed until all jobs are dispatched. This may be used to avoid interleaving of output of shell services with the status output on the console.

    
por 28.03.2013 / 16:03
0

Isso realmente depende da sua definição de "inicializado". Eu suponho que você quer que ele seja executado imediatamente após o getty começar. Para fazer isso, você precisa adicionar seu serviço ao diretório /etc/systemd/system/getty.target.wants/ . Você também deve garantir que seu arquivo esteja usando código semelhante aos outros serviços neste diretório. Para executar um serviço personalizado durante a inicialização e o desligamento (apenas apita a campainha da minha placa-mãe) Eu uso o seguinte script em /etc/systemd/system/getty.target.wants/service_name.service

[Unit]
After=systemd-user-sessions.service plymouth-quit-wait.service
After=rc-local.service
Before=getty.target
IgnoreOnIsolate=yes

[Service]
ExecStart=/usr/bin/myinitscript.sh start
ExecStop=/usr/bin/myinitscript.sh stop
Type=oneshot
RemainAfterExit=true

[Install]
WantedBy=basic.target

/usr/bin/myinitscript.sh é executável e tem um shebang no começo.

Note que nem tudo será iniciado neste ponto da inicialização, mas este é o ponto em que o prompt de logon aparece para o usuário

Embora isso use Before= e After= , foi para mim muito mais compreensível e realmente funciona; Não achei a resposta acima informativa o suficiente. Isso também permite que você use ExecStart= e ExecStop= , em vez de se limitar a um serviço semelhante a Type=simple .

    
por 28.04.2018 / 21:26
-3

Eu não estou familiarizado com os detalhes ou o ArchLinux, mas aqui está como gerenciar o systemd em geral.

Bem, basicamente systemd é uma coleção de scripts em /etc/init.d/ que são apontados por links simbólicos de /etc/rcX.d, onde X é o número do nível de execução. Os links simbólicos são do seguinte formato:

[K | S] + nn + [string]

onde:

  • nn é um número que determina a ordem em que esses scripts são executados
  • string é o nome do script como aparece em /etc/init.d /
  • e, finalmente, K ou S determinam o comando com o qual o script é chamado: pare ou inicie respectivamente.

Portanto, se você quiser que seu script seja executado por último na sequência de inicialização, será necessário fazer o seguinte:

  1. coloque seu script em /etc/init.d/ e torne-o executável
  2. determine o nível de execução alvo no qual o script deve começar (tipicamente 2 para console e 5 para interface gráfica com o usuário). Pode ser determinado com algo como runlevel
  3. dê uma olhada nos scripts que já estão nesse runlevel ls /etc/rc<target runlevel>.d/ e escolha um número de dois dígitos maior do que qualquer outro que já esteja lá.
  4. usando um utilitário específico para sua distribuição como update-rc.d para o Debian ou chkconfig para o Fedora ou manualmente, crie um symlink /etc/rc.d/S no seu script de inicialização.
por 01.02.2013 / 09:19

Tags