Como distinguir se uma unidade systemd é executada pelo apt-get ou durante a inicialização?

4

Pode-se distinguir de alguma forma se

  • a) o daemon foi iniciado durante a inicialização ou,
  • b) (re) iniciado por uma instalação ou atualização do apt-get?

Isso pode ser distinguido de dentro do próprio daemon?

O caso de uso está aqui para ter o script executado pelo systemd Type=oneshot executado apenas na inicialização. Não durante o apt-get install ou upgrades.

    
por adrelanos 18.05.2015 / 15:14

2 respostas

0

EDIT: Note que estou falando apenas sobre o PID 1 porque não consigo falar inglês e achei que você deseja verificar o seu processo de inicialização principal. Mude isso para a unidade em que você está interessado. Tenho certeza que o systemd vai cuspir PID para você de alguma forma. Ou se não, ps ax |grep [commandname] fará isso. Você provavelmente precisará ajustar a diferença de tempo entre o tempo de atividade e o tempo decorrido do processo, apenas adicione um +3 ou o que quer que seja para bc line./EDIT

Eu não estou usando o systemd, então pegue isso com um pouco de sal. A maneira agnóstica do sistema de inicialização seria comparar a hora de início do processo em que você está interessado e o tempo de atividade do sistema. Você pode obtê-los com ps -o etimes [PID] . Tradicionalmente, o PID 1 é reservado para o processo init, mas não sei se o sistema adere a ele. Verifique com ps 1 se é realmente o processo que você está interessado e ajuste se não. Você pode obter o tempo de atividade do sistema em segundos (entre outros) com cat /proc/uptime |cut -d "." -f 1 . Delimitador para cut é ponto, pois ps também elimina os decimais.

compare-os com bc ou com o seu jeito favorito. Exemplo de linha de comando poderia ser: echo $(cut -d "." -f 1 /proc/uptime)"-"$(ps -o etimes [PID] |tail -n 1 |tr -d ' \t')|bc A saída esperada é 0 se o processo for iniciado no tempo de inicialização. Você pode verificar se corresponde às suas descobertas. Para scripts de shell, eu o executaria através de if / then testes e aceito talvez + -3 segundos como tempo de boot. Um segundo pelo menos. Caso contrário, você poderá receber ocasionalmente uma resposta diferente de zero se os tempos de disponibilidade forem diferentes, mesmo que seja uma pequena fração de segundo, o que pode levar a erros de depuração difíceis.

    
por 21.05.2015 / 03:50
0

Por padrão, não há como saber se um serviço é iniciado na inicialização ou durante a atualização / operação normal.

Se você quiser executar um comando específico no momento da inicialização, use o bom e velho cron ou um timer do systemd (consulte systemd.timer (5) ).

    
por 07.04.2017 / 10:48