A garantia do serviço Systemd usando a diretiva 'User =' não é limpa depois que o usuário efetua logout

2

Detalhes

Temos um arquivo de serviço systemd com as seguintes diretrizes pertinentes: %código% %código% Type=forking

A diretiva User=me atualmente não está definida.

Temos uma tarefa cron que executa Restart=always .

Pré-condições

Notamos que:

  • O serviço é iniciado
  • O usuário WantedBy não está logado no sistema

Observações

Sempre que a tarefa cron termina a execução, as filas IPC do System V desaparecem e o serviço é reiniciado, pois os processos de leitura / suspensão nas filas são ativados para descobrir que as filas desapareceram e, portanto, inserem um estado com falha.

Após a conclusão da tarefa cron, notamos o seguinte no syslog:
su –l me –c '<some command>'

Solução possível

Nós me um arquivo assim:

$ cat /etc/systemd/logind.conf.d/my-service.conf
[Login]
KillUserProcesses=no
RemoveIPC=no

Pergunta

Depois de ler o changelog systemd para alterações com o , ainda estamos confusos se a nossa Solução Possível mencionado acima é o suficiente.

Estamos confusos em particular sobre o … systemd[1]: Stopped User Manager for UID XXX

O pai de serviços, conforme relatado por installed , é additional steps are necessary to allow intentionally long-running processes to survive logout. , o que nos faz acreditar que a etapa prescrita para iniciar o serviço usando systemd-cgls não se aplica aqui - isso é verdade? No momento, estamos iniciando o serviço com system.slice

Ainda precisaríamos ativar systemd-run para o usuário systemctl start my-service.service ?

Obrigado pela ajuda.

    
por Yeow_Meng 31.10.2017 / 14:38

1 resposta

1

Você não precisa nem mesmo de KillUserProcesses=no . RemoveIPC=no deve ser suficiente.

Ativar o lingering para o usuário me seria uma alternativa para isso. Isso seria diferente, pois deixaria uma instância de systemd --user em execução o tempo todo.

This behavior is controlled by the KillUserProcesses= setting in logind.conf, and the previous default of "no" is now changed to "yes". This means that user sessions will be properly cleaned up after, but additional steps are necessary to allow intentionally long-running processes to survive logout.

O que a citação significa é que "etapas adicionais" são necessárias para permitir, p. O GNU Screen continuará executando após o logout, se e somente se KillUserProcesses = yes. As etapas adicionais são basicamente systemd-run --user --scope COMMAND e permitem a permanência.

Isso não está relacionado ao seu desejo. Porque o seu processo de serviço não é executado dentro de uma sessão de login.

Sua conclusão de olhar para systemd-cgls é exatamente correta.

Uma alternativa seria nunca efetuar login como o usuário me . su conta como um login. O usuário crontabs conta como um login (a menos que /etc/pam.d/cron evite invocar o pam_systemd, direta ou indiretamente). Por exemplo, você pode substituir seu uso de su por setpriv ou, em vez de cron, usar uma unidade de timer do systemd que inicia um serviço que tenha User=me .

    
por 31.10.2017 / 15:15

Tags