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 / 461454
Accepted
WoJ
WoJ
Asked: 2018-08-09 23:39:03 +0800 CST2018-08-09 23:39:03 +0800 CST 2018-08-09 23:39:03 +0800 CST

Como se pode verificar no programa se é um processo de serviço que foi iniciado pelo systemd? [duplicado]

  • 772
Essa pergunta já tem respostas aqui :
encontrando a unidade systemd 'possuindo' um processo de daemon em execução (3 respostas)
Fechado há 4 anos .

Existe uma maneira documentada de verificar, de dentro do código do programa em execução como o próprio serviço , que ele foi iniciado systemd(em vez de ser iniciado de dentro de uma sessão de login interativa, do cron, etc.)?

Minha solução atual é definir uma variável de ambiente na .serviceunidade ( Environment=...) e verificar sua existência no meu código. Mas pode haver algo diretamente disponível.

systemd services
  • 2 2 respostas
  • 202 Views

2 respostas

  • Voted
  1. Best Answer
    JdeBP
    2018-08-10T03:18:06+08:002018-08-10T03:18:06+08:00

    Um não pode.

    Tudo o que o systemd fornece a um processo chamado para um serviço – seus argumentos, seu ambiente, o(s) grupo(s) de controle que o contém, seus limites de recursos, seus descritores de arquivos abertos – pode ser e é feito por outros gerenciadores de serviço também. Além disso, não há convenção compartilhada para identificar qual gerente de serviço está gerenciando serviços; sem variáveis ​​de ambiente convencionais, nem outros marcadores.

    Mecanismos errôneos

    Você pode estar pensando em verificar o nome executável do processo pai. Este é um não inicial, pelos motivos expostos em https://unix.stackexchange.com/a/196252/5132 . O nome da imagem do programa executável do processo pai (para serviços de todo o sistema) estará /sbin/initnos sistemas operacionais Debian Linux, porque o Debian tem a convenção de ser um link simbólico de estilo alternativo para o arquivo de imagem do programa do processo 1 real, e o /initprograma no initramfs precisando apenas saber esse nome.

    Você pode estar pensando que, apesar do que acabei de escrever, os grupos de controle são um marcador do systemd. Eles não são. Aqui está a árvore do grupo de controle de um processo de serviço sendo gerenciado por um gerenciador de serviço completamente diferente, service-managerdo conjunto de ferramentas nosh:

    % systemd-cgls /system.slice/service-manager.service/[email protected]
    Grupo de controle /system.slice/service-manager.service/[email protected]:
    └─[email protected]
      └─1433 tinydns
    %
    

    O tinydnsprograma, encontrando um grupo de controle em /proc/self/cgroup, não tem justificativa para supor que o systemd configurou esse grupo de controle. Na verdade, foi configurado pelo move-to-control-grouputilitário:

    % cat /var/local/sv/[email protected]/service/run
    #!/bin/nosh
    #Executar arquivo gerado a partir de ./[email protected]
    Soquete #DNS/UDP em 127.53.0.1
    udp-socket-listen --systemd-compatibility --combine4and6 127.53.0.1 domínio
    move-to-control-group "../[email protected]/[email protected]"
    envdir env
    envuidgid -- tinydns-d
    setlogin -- tinydns-d
    hardlimit -d 3000000
    softlimit -d hard
    ./serviço
    %
    

    Nenhuma outra alteração de estado do processo é exclusiva do systemd. As variáveis ​​de ambiente podem ser definidas com setenv(a ferramenta de carregamento de cadeia) userenv, machineenv, ou export(a ferramenta de carregamento de cadeia), limites de recursos com softlimit, ulimit(a ferramenta de carregamento de cadeia) ou s6-softlimit, descritores de arquivos abertos com redirfdou fdredir, namespaces com unshare, prioridades de agendamento com rtprioou chrt, política NUMA com numactl; e assim por diante.

    systemd não é o único falante do LISTEN_FDSprotocolo, como pode ser visto a partir do acima. INVOCATION_IDtambém é apenas um exercício de preenchimento env/INVOCATION_IDno início de um runprograma e encadeamento através de envdir. Nenhum deles é confiável como marcadores.

    Erros conceituais

    Há também a falha que você deseja excluir processos iniciados por cron. A falha conceitual aqui é que croné um serviço, e os processos que ele gera estão sendo executados no contexto desse serviço . Não há distinção mágica entre um processo gerado pelo cronprocesso no cronserviço e um processo gerado por algum outro processo de serviço em algum outro serviço, o que torna o primeiro de alguma forma distinguível do segundo.

    Livre-se desse erro conceitual e uma resposta aparecerá. A única coisa que distingue os daemons é que as sessões (POSIX) às quais eles pertencem não possuem terminais de controle, e eles não têm outras associações (do nome definido por setlogin, através do mecanismo de sessão de login do espaço do usuário do systemd, para vários contextos de segurança) com qualquer sessão de login. Não há uma maneira direta portátil de consultar qual é o terminal de controle de uma sessão, mas observar que a abertura /dev/ttyfalha é uma rota indireta disponível. Observe que algumas funções da biblioteca C superficialmente promissoras não são realmente confiáveis ​​na prática.

    Leitura adicional

    • https://unix.stackexchange.com/a/398951/5132
    • https://unix.stackexchange.com/a/187540/5132
    • Como obter o nome real do terminal de controle?
    • conjuntos de ferramentas:
      • s6 . Laurent Bercot. skarnet.org.
      • executar . Laurent Bercot. skarnet.org.
      • Jonathan de Boyne Pollard (2018). nosh . Programas.
    • manuais de referência:
      • export. Laurent Bercot. executar . skarnet.org.
      • redirfd. Laurent Bercot. executar . skarnet.org.
      • s6-softlimit. Laurent Bercot. s6 . skarnet.org.
      • chpst . executá-lo. Gerrit Pap. smarten.org.
      • Jonathan de Boyne Pollard (2018). service-manager. Guia de no . Programas.
      • Jonathan de Boyne Pollard (2018). move-to-control-group. Guia de no . Programas.
      • Jonathan de Boyne Pollard (2018). setenv. Guia de no . Programas.
      • Jonathan de Boyne Pollard (2018). softlimit. Guia de no . Programas.
      • Jonathan de Boyne Pollard (2018). ulimit. Guia de no . Programas.
      • Jonathan de Boyne Pollard (2018). fdredir. Guia de no . Programas.
      • Jonathan de Boyne Pollard (2018). unshare. Guia de no . Programas.
      • Jonathan de Boyne Pollard (2018). setlogin. Guia de no . Programas.
    • 2
  2. perror
    2018-08-09T23:57:44+08:002018-08-09T23:57:44+08:00

    Eu acho que você pode usar o seguinte comando:

    #> systemctl list-unit-files --state=enabled
    cups.path                                  enabled        
    accounts-daemon.service                    enabled        
    anacron.service                            enabled        
    apparmor.service                           enabled        
    atd.service                                enabled        
    [email protected]                            enabled        
    avahi-daemon.service                       enabled        
    ...
    

    Por si só systemctl list-unit-fileslista todos os arquivos de unidade instalados que podem iniciar um serviço. Os rotulados como enabledsão aqueles iniciados no momento em que você digita o comando.

    • 0

relate perguntas

  • 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

  • resultados inesperados de `service | grep`

  • 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