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

26

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

Agora, usamos o systemd, não temos rc.localmais. Systemd inicia o serviço paralelo. Você pode escrever seu próprio serviço para executar um rc.local`, mas não pode garantir que ele seja executado após todos os serviços do sistema terem sido carregados.

Existe uma forma de fazer isso? Ou temos que usar Beforee Afterno arquivo de serviço systemd?

比尔 盖子
fonte
5
Systemd, não Upstart !!
比尔盖子
Especifique o nome e a versão do SO?
STTR 31/01
OS: Arch Linux, Versão: N / A
比尔盖子
11
@ 比尔 盖子 Por que "last", você não conhece as dependências do script ou deseja que o último seja seguro?
Paul

Respostas:

27

No systemd, é aconselhável usar Before=e After=solicitar seus serviços de maneira adequada em relação aos outros.

Mas desde que você pediu uma maneira sem usar Beforee After, você pode usar:

Type=idle

o que man systemd.serviceexplica:

O comportamento de idleé muito semelhante a simple; no entanto, a execução real do programa de serviço é adiada até que todos os trabalhos ativos sejam despachados. Isso pode ser usado para evitar a intercalação da saída dos serviços de shell com a saída de status no console. Observe que esse tipo é útil apenas para melhorar a saída do console, não é útil como uma ferramenta geral de pedido de unidades e o efeito desse tipo de serviço está sujeito a um tempo limite de 5s, após o qual o programa de serviço é chamado de qualquer maneira.

SimonPe
fonte
11
Oi, você gostaria de elaborar a sintaxe se eu fosse usar antes ou depois?
R4ccoon
Um pouco tópico diferente, mas se alguém quiser executar processos de usuário separar processos do sistema, há askubuntu.com/a/859583/457417
Ben Creasy
funcionou perfeitamente ao conjunto /proc/sys/kernel/modules_disabledpara 1no final do processo de inicialização
Stuart Cardall
0

Realmente depende da sua definição de "inicializado". Suponho que você queira que ele seja executado imediatamente após o início do getty. Para fazer isso, você precisa adicionar seu serviço ao /etc/systemd/system/getty.target.wants/diretório 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 na inicialização e desligamento (apenas emite um sinal sonoro na campainha da minha placa-mãe), use 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 início.

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

Embora isso use Before=e After=, era 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 ambos ExecStart=e ExecStop=, em vez de se limitar a um Type=simpleserviço semelhante.

Hack5
fonte
-2

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 em /etc/rcX.d, em que X é o número do nível de execução. Os links simbólicos possuem o 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: stop ou start respectivamente.

Portanto, se você deseja que seu script seja executado por último na sequência de inicialização, faça o seguinte:

  1. coloque seu script em /etc/init.d/ e torne-o executável
  2. determine o nível de execução de destino no qual o script deve iniciar (tipicamente 2 para console e 5 para interface gráfica com o usuário). Pode ser determinado com algo comorunlevel
  3. verifique quais scripts já existem neste nível de execução ls /etc/rc<target runlevel>.d/e escolha um número de dois dígitos que seja maior que qualquer outro já existente.
  4. usando um utilitário específico para sua distribuição, como update-rc.dpara Debian ou chkconfigsimilar ao Fedora ou manualmente, crie um link simbólico /etc/rc.d/S para o seu script init.
Pavel A
fonte
5
O que você descreveu é realmente sysVinit. Embora seja verdade que o systemd seja compatível com o funcionamento do sysVinit, há uma diferença importante - tudo é executado em paralelo. Existem também dois tipos de serviços, serviços sysVinit e serviços systemd. Sua resposta pode ajudar a executar algo após os serviços sysVinit, mas não necessariamente os systemd.
31413 Sam
11
O Systemd não pretende ser compatível com o sysvinit desde o primeiro dia.
Lzap