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 alternativa que encontrei é criar o rc.local e conceder permissões de execução.
printf '#!/bin/bash \n\nexit 0' >/etc/rc.local
chmod +x /etc/rc.local
Por exemplo, se eu receber um servidor legado com um rc.local simples configurado por você, vou saber o que você fez e quanto vai doer para atualizar ou instalar algo novo na distribuição, pois o rc.local foi respeitado por fontes externas. pacotes, mas por outro lado, se eu instalar um servidor e criar uma unidade systemd ou dois ou três (ou até serviços sysvinit), apenas para executar uma tarefa simples, isso pode às vezes dificultar sua vida e muito mais do que isso minhas unidades algum dia os nomes podem 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!
Vejo outra pergunta perguntando onde está o rc.local e a resposta foi criá-lo e conceder permissões de execução. Acho que minha pergunta não é realmente uma duplicata , porque não quero saber onde ela está - acredite, só quero para aceitar que está obsoleto , mas não consigo encontrar a maneira correta de fazer esse tipo de coisa, devo criar uma unidade apenas para coisas simples como essa?
Respostas:
Como salientado em outro lugar, torna-se moderadamente impuro para usar
rc-local.service
sobsystemd
.poweroff
/reboot
comanda que muitas pessoas usam).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 exposto, tudo o que você precisa fazer é fazer sua própria cópia! Aqui está a mágica:Eu não acho que você precise 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 depende de qualquer outro serviço, inclusive
network-online.target
, você deve 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 nos serviços de "inicialização antecipada" - especificamente, serviços que já foram solicitados anteriormente
basic.target
. Serviços comomy-startup.service
são pedidos automaticamente depoisbasic.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 encomendados antes
basic.target
, executandosystemctl list-dependencies --after basic.target
. (Observe que--after
não--before
).Há algumas considerações que eu acho que também se aplicavam ao pré-systemd
rc.local
:rc.local
.[*] Eu usei
Type=oneshot
+RemainAfterExit=yes
porque faz mais sentido para a maioria dos scripts únicos. Ele formaliza que você executará uma série de comandos, quemy-startup
serão mostrados como "ativos" após a conclusão e que você não iniciará um daemon.fonte
.service
unidade de sistema nativa ou, se você realmente deseja escrever um script de inicialização LSB, pode fazê-lo. Eu não queria recomendar a instalação de vários daemonsrc-local.service
ou equivalente, acho que provavelmente funciona, mas parece muito melhor se você puder reiniciar o daemon individual comsystemctl restart my-daemon
qualquer outra coisa. Pretende-se que você coloque seus serviços locais/etc/systemd/system
.local-
...Type=oneshot
... formaliza que ... você não iniciará um daemon. Se você quiser informações sobre como iniciar um daemon, faça uma nova pergunta.Esqueça
rc.local
.Como eu disse sobre 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 com versões anteriores duplas no systemd, porque é um mecanismo de compatibilidade com versões anteriores de um mecanismo que por si só era um mecanismo de compatibilidade norc
clone van Smoorenburg System 5 .Usar
/etc/rc.local
pode dar terrivelmente errado. As pessoas ficaram surpresas com o fato de o systemd não funcionarrc.local
da mesma maneira, no mesmo local do bootstrap, como estão acostumados. (Ou, erroneamente, espera: na verdade, ele não foi executado por último no sistema antigo, como o manual do OpenBSD ainda aponta.) Outros se surpreenderam com o fato de que o que eles criaramrc.local
esperando as velhas formas de fazer as coisas é então completamente desfeita pelos gostos de novasudev
regras, o NetworkManager,systemd-logind
,systemd-resolved
, ou vários "kit" s.Como exemplificado por " Por que o` init 0` resulta em "Excesso de Argumentos" na instalação do Arch? ", Alguns sistemas operacionais já fornecem systemd sem os recursos de compatibilidade com versões anteriores , como o
systemd-rc-local-generator
gerador . Enquanto o Debian ainda mantém os recursos de compatibilidade com versões anteriores , o Arch Linux constrói o systemd com eles desativados . Assim, no Arch e nos sistemas operacionais como ele esperam/etc/rc.local
ser totalmente ignorados .Esqueça
rc.local
. Não é o caminho a percorrer. Você tem um sistema operacional systemd + Linux. Portanto, faça uma unidade de serviço do sistema 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 é removido três vezes, orc
clone van Smoorenburg System 5 que se seguiurc.local
foi substituído por duas vezes , há mais de uma década, primeiro pelo iniciante e depois pelo systemd.)Lembre-se também da primeira regra para migrar para o systemd .
Essa nem é uma idéia nova, específica do systemd. Nos
rc
sistemas van Smoorenburg e Upstart, a coisa a fazer era criar umrc
script van Smoorenburg ou arquivo de trabalho Upstart adequado, em vez de usá-lorc.local
. Até 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 nível de execuçãorc
no AT&T Unix System 3 (com um pouco diferente/etc/inittab
no AT&T Unix System 5) em 1983 . Até isso agora é história.Crie definições de serviço nativas apropriadas para o seu sistema de gerenciamento de serviços, seja um pacote configurável para os conjuntos 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 tarefa para Upstart, um diretório de serviço para runit / s6 / daemontools -core, ou mesmo um/etc/init.d/
script para van Smoorenburgrc
.No systemd, esses arquivos de unidades de serviço adicionadas pelo administrador entram
/etc/systemd/system/
normalmente (ou/usr/local/lib/systemd/system/
raramente). Com o nosh service manager,/var/local/sv/
é um local convencional para pacotes de serviços locais. Mewburnrc
nos usos do FreeBSD/usr/local/etc/rc.d/
. Arquivos de unidades de serviço empacotados e pacotes de serviços, se você os estiver criando, vão para lugares diferentes.Leitura adicional
rc.local
. Manual do Gerente de Sistema FreeBSD . 23-04-2016./etc/rc.local
ouchmod -x
ele . Redhat bug # 734268.rc.local
está começando cedo . systemd bug # 7703rc.local
. bencane.com./etc/inittab
é uma coisa do passado. . Respostas dadas com freqüência.systemd.unit
página de manual ". Errata para o systemd doco . Respostas dadas com freqüência.fonte
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:
fonte
StandardOutput=journal+console
(o console é equivalente a tty no seu exemplo), o que parece ser muito mais útil para solucionar problemas. Também o suporte paraSysVStartPriority=
foi removido em algum momento. Talvez você possa comentar o quão importanteSysVStartPriority=
é ou removê-lo. Além disso, é uma resposta decente.