Não consigo encontrar a maneira correta de executar alguns scripts locais (ou comandos muito locais) no systemd, já sei que não devo criar um serviço (no systemd uma unidade) para esse tipo de script (ou devo?)....
A solução que encontrei é criar rc.local e dar a ele permissões de execução.
printf '#!/bin/bash \n\nexit 0' >/etc/rc.local
chmod +x /etc/rc.local
Por exemplo, se eu pegar um servidor legado com um rc.local simples configurado por você, saberei o que você fez e o quanto vai doer atualizar ou instalar algo novo na distro, já que o rc.local era respeitado por externos pacotes, mas por outro lado se eu instalar um servidor e criar uma unidade systemd ou duas ou três (ou até serviços sysvinit), apenas por fazer uma tarefa simples, isso às vezes pode dificultar sua vida, e muito mais do que isso minhas unidades nomes podem algum dia entrar em conflito com os nomes dos novos serviços criados pelo desenvolvimento da distribuição, e talvez instalados em uma atualização, causando problemas para meus scripts!
Eu vejo outra pergunta perguntando sobre onde está o rc.local e a resposta foi criá-lo e dar permissões de execução, acho que minha pergunta não é realmente uma duplicata , pois não quero saber onde está - acredite, só quero aceitar que está obsoleto , mas não consigo encontrar a maneira correta de fazer esse tipo de coisa, devo realmente criar uma unidade apenas para algo simples assim?
Como apontado em outro lugar, torna-se moderadamente impuro usar
rc-local.service
sobsystemd
.poweroff
/reboot
comandos que muita gente usa).rc-local.service
uma maneira, mas o Debian fornece um arquivo drop-in que altera pelo menos uma configuração importante.rc-local.service
muitas vezes pode funcionar bem. Se você está preocupado com o que foi dito acima, tudo o que você precisa fazer é fazer sua própria cópia! Aqui está a magia:Eu não acho que você precisa entender todos os detalhes[*], mas há duas coisas que você precisa saber aqui.
Você precisa habilitar isso com
systemctl enable my-startup.service
.Se o seu script tiver dependência de qualquer outro serviço, incluindo
network-online.target
, você deverá declará-lo. Por exemplo, adicione uma[Unit]
seção, com as linhasWants=network-online.target
eAfter=network-online.target
.Você não precisa se preocupar com dependências de serviços de "inicialização antecipada" - especificamente, serviços que já foram solicitados antes do
basic.target
. Serviços comomy-startup.service
são automaticamente solicitados apósbasic.target
, a menos que sejam definidosDefaultDependencies=no
.Se você não tiver certeza se uma de suas dependências é um serviço de "inicialização antecipada", uma abordagem é listar os serviços solicitados antes
basic.target
de , executandosystemctl list-dependencies --after basic.target
. (Observe que é--after
, não--before
).Existem algumas considerações que acho que também se aplicam ao pre-systemd
rc.local
:rc.local
.[*] Eu usei
Type=oneshot
+RemainAfterExit=yes
porque faz mais sentido para a maioria dos scripts one-shot. Ele formaliza que você executará uma série de comandos, quemy-startup
serão mostrados como "ativos" depois de concluídos, e que você não iniciará um daemon.Esqueça
rc.local
.Como eu disse sobre o CentOS 7 e sobre o Debian 8 e sobre o Ubuntu 15 :
Você está usando um sistema operacional systemd+Linux.
/etc/rc.local
é um mecanismo de compatibilidade retroativa dupla no systemd, porque é um mecanismo de compatibilidade retroativa para um mecanismo que era ele próprio um mecanismo de compatibilidade norc
clone van Smoorenburg System 5.O uso
/etc/rc.local
pode dar terrivelmente errado. As pessoas ficaram surpresas com o fato de o systemd não rodarrc.local
exatamente da mesma maneira, exatamente no mesmo lugar no bootstrap, como eles estão acostumados. (Ou erroneamente esperar: de fato, ele não foi executado por últimorc.local
no sistema antigo , como o manual do OpenBSD ainda aponta.) em seguida, completamente desfeito pelos gostos de novasudev
regras, NetworkManager,systemd-logind
,systemd-resolved
, ou vários "Kit"s.Como exemplificado por "https://unix.stackexchange.com/questions/389289/", alguns sistemas operacionais já fornecem systemd sem os recursos de compatibilidade com versões anteriores , como o
systemd-rc-local-generator
generator . Enquanto o Debian ainda mantém os recursos de compatibilidade com versões anteriores , o Arch Linux constrói o systemd com eles desligados . Assim, no Arch e sistemas operacionais como ele esperam/etc/rc.local
ser totalmente ignorados .Esqueça
rc.local
. Não é o caminho a seguir. Você tem um sistema operacional systemd+Linux. Portanto, faça uma unidade de serviço systemd adequada e não comece a partir de um ponto que esteja a dois níveis de compatibilidade com versões anteriores. (No Ubuntu e no Fedora, ele é três vezes removido, orc
clone van Smoorenburg System 5 que se seguiurc.local
foi substituído duas vezes , mais de uma década atrás, primeiro pelo upstart e depois pelo systemd.)Lembre-se também da primeira regra para migrar para o systemd .
Essa nem é uma ideia nova específica para o systemd. Nos sistemas van Smoorenburg
rc
e Upstart, a coisa a fazer era fazer umrc
script van Smoorenburg adequado ou arquivo de trabalho Upstart em vez de usarrc.local
. Até mesmo o manual do FreeBSD observa que hoje em dia se cria umrc
script Mewburn adequado em vez de usar/etc/rc.local
. Mewburnrc
foi introduzido pelo NetBSD 1.5 em 2000./etc/rc.local
data da época da Sétima Edição Unix e antes. Foi substituído por/etc/inittab
um runlevel baseadorc
no AT&T Unix System 3 (com um pouco diferente/etc/inittab
no AT&T Unix System 5) em 1983 . Até isso já é história.Crie definições de serviço nativas adequadas para o seu sistema de gerenciamento de serviços, seja um pacote de serviços para o conjunto de ferramentas nosh
service-manager
esystem-control
, um/etc/rc.d/
script para Mewburnrc
, um arquivo de unidade de serviço para systemd, um arquivo de trabalho para Upstart, um diretório de serviço para runit/s6/daemontools -encore, ou mesmo um/etc/init.d/
roteiro para van Smoorenburgrc
.No systemd, esses arquivos de unidade de serviço adicionados pelo administrador entram
/etc/systemd/system/
normalmente (ou/usr/local/lib/systemd/system/
raramente). Com o gerenciador de serviços nosh,/var/local/sv/
é um local convencional para pacotes de serviços locais. Mewburnrc
no FreeBSD usa/usr/local/etc/rc.d/
. Arquivos de unidade de serviço empacotados e pacotes de serviço, se você os estiver criando, vá em lugares diferentes, no entanto.Leitura adicional
rc.local
. Manual do Gerenciador de Sistemas FreeBSD . 23-04-2016./etc/rc.local
-chmod -x
o . Erro de chapéu vermelho #734268.rc.local
está começando cedo . erro do sistema #7703rc.local
. bencane. com./etc/inittab
é coisa do passado. . Respostas Frequentes.systemd.unit
página de manual ". Errata para systemd doco . Respostas Frequentes.Resumo de https://www.linuxbabe.com/linux-server/how-to-enable-etcrc-local-with-systemd
Crie /etc/systemd/system/rc-local.service:
Então:
Verificar com: