
Introdução
Atualizei recentemente para o Fedora 17 e estou me acostumando com o systemctl
gerenciador de daemon mais recente versus scripts de inicialização do shell.
Um recurso que preciso em alguns dos meus daemons é a capacidade deinteragir com seus consolesporque desligamentos impuros não iniciados pelo próprio processo podem causar corrupção do banco de dados. Portanto, executar um, systemctl stop service-name.service
por exemplo, pode causar perda irreversível de dados.
Esses consoles leem a entrada do usuário por meio de stdin ou métodos semelhantes, então o que tenho feito em meu antigo sistema operacional é colocar esses daemons em primeiro plano em uma screen
sessão, e eususpensoaquela sessão de tela com ^A ^z
. Também é importante notar que agora fiz systemctl
isso automaticamente se o computador for reinicializado, mas ainda não resolve meu problema potencial de corrupção de dados que estou tentando evitar.
Minha pergunta
Existe uma maneira de systemctl
interagir diretamente com o console de processos que ele gera? Posso conectar um processo systemctl
para obter acesso ao seu console?
Obrigado
Vocês sempre dão ótimas respostas, então estou recorrendo a vocês!
Responder1
Parece que você pode redirecioná-lo para um tty.
StandardInput=
Controla onde o descritor de arquivo 0 (STDIN) dos processos executados está conectado. Aceita null, tty, tty-force, tty-fail ou socket. Se null for selecionado, a entrada padrão será conectada a /dev/null, ou seja, todas as tentativas de leitura pelo processo resultarão em EOF imediato. Se tty for selecionado, a entrada padrão é conectada a um TTY (conforme configurado por TTYPath=, veja abaixo) e o processo executado se torna o processo de controle do terminal. Se o terminal já estiver sendo controlado por outro processo, o processo executado aguarda até que o processo de controle atual libere o terminal.tty-force é semelhante ao tty, mas o processo executado é forçado e imediatamente transformado no processo de controle do terminal, potencialmente removendo processos de controle anteriores do terminal.tty-fail é semelhante ao tty, mas se o terminal já tiver um processo de controle, a inicialização do processo executado falha. A opção socket só é válida em serviços ativados por soquete e somente quando o arquivo de configuração do soquete (veja systemd.socket(5) para detalhes) especifica apenas um único soquete. Se esta opção for definida, a entrada padrão será conectada ao soquete a partir do qual o serviço foi ativado, o que é útil principalmente para compatibilidade com daemons projetados para uso com o daemon inetd(8) tradicional. Essa configuração é padronizada como nula.
Ah, e se isso não funcionar, faremos algo realmente complicado com soquetes Unix que tenho certeza que você faráamor.
Dane-se esse absurdo, tente algo assim se o acima não for aceitável:
Você pode tentar escrever no diretório /proc pid. Digamos que o pid dos seus daemons seja 2000, tente escrever para /proc/2000/fd/0
Você pode adicionar essa linha a ExecStop=, o que evita que você tenha que interagir manualmente.