AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 471824
Accepted
Luciano Andress Martini
Luciano Andress Martini
Asked: 2018-09-28 05:04:02 +0800 CST2018-09-28 05:04:02 +0800 CST 2018-09-28 05:04:02 +0800 CST

Qual é o substituto correto para rc.local no systemd em vez de recriar rc.local

  • 772

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?

systemd rc.local
  • 3 3 respostas
  • 60046 Views

3 respostas

  • Voted
  1. Best Answer
    sourcejedi
    2018-11-05T09:54:26+08:002018-11-05T09:54:26+08:00

    Como apontado em outro lugar, torna-se moderadamente impuro usar rc-local.servicesob systemd.

    1. É teoricamente possível que sua distribuição não o habilite. (Acho que isso não é comum, por exemplo, porque desabilitar a mesma opção de compilação também remove poweroff/ rebootcomandos que muita gente usa).
    2. A semântica não é totalmente clara. O Systemd define rc-local.serviceuma maneira, mas o Debian fornece um arquivo drop-in que altera pelo menos uma configuração importante.

    rc-local.servicemuitas 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:

    # /etc/systemd/system/my-startup.service
    [Service]
    Type=oneshot
    RemainAfterExit=yes
    ExecStart=/usr/local/libexec/my-startup-script
    
    [Install]
    WantedBy=multi-user.target
    

    Eu não acho que você precisa entender todos os detalhes[*], mas há duas coisas que você precisa saber aqui.

    1. Você precisa habilitar isso com systemctl enable my-startup.service.

    2. 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 linhas Wants=network-online.targete After=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 como my-startup.servicesão automaticamente solicitados após basic.target, a menos que sejam definidos DefaultDependencies=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.targetde , executando systemctl 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:

    1. Você precisa ter certeza de que seus comandos não estão em conflito com outro programa que tenta controlar a mesma coisa.
    2. É melhor não iniciar programas de longa duração, também conhecidos como daemons do rc.local.

    [*] Eu usei Type=oneshot+ RemainAfterExit=yesporque faz mais sentido para a maioria dos scripts one-shot. Ele formaliza que você executará uma série de comandos, que my-startupserão mostrados como "ativos" depois de concluídos, e que você não iniciará um daemon.

    • 38
  2. JdeBP
    2018-09-28T08:06:23+08:002018-09-28T08:06:23+08:00

    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 no rcclone van Smoorenburg System 5.

    O uso /etc/rc.localpode dar terrivelmente errado. As pessoas ficaram surpresas com o fato de o systemd não rodar rc.localexatamente 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 novas udevregras, 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-generatorgenerator . 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, o rcclone van Smoorenburg System 5 que se seguiu rc.localfoi 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 rce Upstart, a coisa a fazer era fazer um rcscript van Smoorenburg adequado ou arquivo de trabalho Upstart em vez de usar rc.local. Até mesmo o manual do FreeBSD observa que hoje em dia se cria um rcscript Mewburn adequado em vez de usar /etc/rc.local. Mewburn rcfoi introduzido pelo NetBSD 1.5 em 2000.

    /etc/rc.localdata da época da Sétima Edição Unix e antes. Foi substituído por /etc/inittabum runlevel baseado rcno AT&T Unix System 3 (com um pouco diferente /etc/inittabno 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-managere system-control, um /etc/rc.d/script para Mewburn rc, 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 Smoorenburg rc.

    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. Mewburn rcno 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

    • Lennart Poettering et ai. (2014). systemd-rc-local-generator . páginas de manual do systemd. Freedesktop.org.
    • rc.local. Manual do Gerenciador de Sistemas FreeBSD . 23-04-2016.
    • https://unix.stackexchange.com/a/233581/5132
    • Poesia de Lennart (2011-08-29). Por favor, remova /etc/rc.local- chmod -xo . Erro de chapéu vermelho #734268.
    • https://unix.stackexchange.com/a/211927/5132
    • Dirk Schmitt (2017-12-19). rc.localestá começando cedo . erro do sistema #7703
    • https://wiki.archlinux.org/index.php?title=Systemd&diff=378926&oldid=378924
    • Benjamim Cane (2011-12-30). Quando está ok e não ok usarrc.local . bencane. com.
    • https://unix.stackexchange.com/a/49636/5132
    • Poesia de Lennart (2010-10-01). Como faço para converter um script de inicialização do SysV em um arquivo de serviço systemd? . 0pointer.de.
    • https://askubuntu.com/questions/523369/
    • Jonathan de Boyne Pollard (2015). /etc/inittabé coisa do passado. . Respostas Frequentes.
    • Jonathan de Boyne Pollard (2014). Uma visão lado a lado de scripts de execução e unidades de serviço. . Respostas Frequentes.
    • Jonathan de Boyne Pollard (2014). Um exemplo real de configuração e execução de um serviço com nosh . Programas.
    • Jonathan de Boyne Pollard (2016). " Caminhos de pesquisa do sistema ausentes na systemd.unitpágina de manual ". Errata para systemd doco . Respostas Frequentes.
    • 20
  3. Ole Tange
    2019-10-03T11:28:01+08:002019-10-03T11:28:01+08:00

    Resumo de https://www.linuxbabe.com/linux-server/how-to-enable-etcrc-local-with-systemd

    Crie /etc/systemd/system/rc-local.service:

    # /etc/systemd/system/rc-local.service
    [Unit]
     Description=/etc/rc.local Compatibility
     ConditionPathExists=/etc/rc.local
    
    [Service]
     Type=forking
     ExecStart=/etc/rc.local start
     TimeoutSec=0
     StandardOutput=tty
     RemainAfterExit=yes
     SysVStartPriority=99
    
    [Install]
     WantedBy=multi-user.target
    

    Então:

    sudo touch /etc/rc.local
    sudo chmod +x /etc/rc.local
    sudo systemctl enable rc-local
    

    Verificar com:

    sudo systemctl start rc-local.service
    sudo systemctl status rc-local.service
    
    • 6

relate perguntas

  • Níveis diferenciadores no journalctl

  • Altere o editor padrão para vim para _ sudo systemctl edit [unit-file] _

  • systemd: como posso executar um script no início de um serviço, sem editar a definição do serviço

  • Use o suporte de watchdog do systemd para reiniciar o aplicativo

  • Inicie/pare o serviço systemd usando o atalho de teclado [fechado]

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    ssh Não é possível negociar: "nenhuma cifra correspondente encontrada", está rejeitando o cbc

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    Como descarregar o módulo do kernel 'nvidia-drm'?

    • 13 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add retorna com: "Erro ao conectar ao agente: nenhum arquivo ou diretório" 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya Por que o Linux usa LF como caractere de nova linha? 2017-12-20 05:48:21 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve