Eu preciso executar um daemon simples a partir da imagem do initrd do sistema. De acordo com a documentação system.initrd, quando o systemd estiver sendo executado diretamente do initrd, todos os processos em execução serão eliminados em switch-root
, a menos que argv[0][0]
do caractere do processo principal seja @
. A única maneira que eu encontrei para alterar argv[0]
para adicionar declaração adequada no código-fonte do aplicativo, mas infelizmente este é um software proprietário e eu não tenho acesso ao seu código-fonte. Eu também descobri que o comando shell exec
pode executar o processo sob um nome diferente, alterando o parâmetro argv[0]
, então escrevi um arquivo de serviço simples para o systemd usando exec
para implantar novo processo e funciona, ps aux
mostra esse processo de serviço está sendo executado sob o nome correto ( @bin/process-name ...
). Como mencionado anteriormente, os processos com argv[0]
iniciando com o caractere @
não devem ser eliminados em switch-root
.
Minha receita do sistema:
[Unit]
Description=Simple service
[Service]
ExecStart=/bin/bash -c 'exec -a "@bin/process-name" /bin/application'
Certifico-me de que este serviço está funcionando antes de switch-root
, ativando-o manualmente no estágio initrd, mas ele é eliminado como qualquer outro processo em execução. Eu tentei executá-lo como aplicativo normal, mas isso não está funcionando também. Eu até escrevi meu próprio aplicativo, que muda seu argv[0][0]
para @
e, como antes, é eliminado em switch-root
. Então, como executar o serviço persistente do initrd? Parece que o systemd mata TODOS os processos durante switch-root
não deixando nada para trás, mesmo processos especiais que não deveriam ser eliminados.
Initrd: Dracut
OS: Debian Jessie
Systemd version: 208-8
Fonte: link