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 .service
unidade ( Environment=...
) e verificar sua existência no meu código. Mas pode haver algo diretamente disponível.
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/init
nos 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/init
programa 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-manager
do conjunto de ferramentas nosh:O
tinydns
programa, 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 pelomove-to-control-group
utilitário: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
, ouexport
(a ferramenta de carregamento de cadeia), limites de recursos comsoftlimit
,ulimit
(a ferramenta de carregamento de cadeia) ous6-softlimit
, descritores de arquivos abertos comredirfd
oufdredir
, namespaces comunshare
, prioridades de agendamento comrtprio
ouchrt
, política NUMA comnumactl
; e assim por diante.systemd não é o único falante do
LISTEN_FDS
protocolo, como pode ser visto a partir do acima.INVOCATION_ID
também é apenas um exercício de preenchimentoenv/INVOCATION_ID
no início de umrun
programa e encadeamento através deenvdir
. 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 é quecron
é 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 pelocron
processo nocron
serviç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/tty
falha é 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
export
. Laurent Bercot. executar . skarnet.org.redirfd
. Laurent Bercot. executar . skarnet.org.s6-softlimit
. Laurent Bercot. s6 . skarnet.org.service-manager
. Guia de no . Programas.move-to-control-group
. Guia de no . Programas.setenv
. Guia de no . Programas.softlimit
. Guia de no . Programas.ulimit
. Guia de no . Programas.fdredir
. Guia de no . Programas.unshare
. Guia de no . Programas.setlogin
. Guia de no . Programas.Eu acho que você pode usar o seguinte comando:
Por si só
systemctl list-unit-files
lista todos os arquivos de unidade instalados que podem iniciar um serviço. Os rotulados comoenabled
são aqueles iniciados no momento em que você digita o comando.