Como uso o PuTTY para interagir com um serviço em execução em / dev / tty2?

2

Ok, então eu tenho um programa (que eu não escrevi e não posso modificar) que estou executando como um serviço usando systemd no meu servidor de nuvem Ubuntu 16.04. Está funcionando muito bem, exceto que eu preciso interagir com o programa em execução, e a única maneira de o programa suportar interagir com ele é através de stdin / stdout . Eu percebo que é muito pouco convencional para um serviço usar apenas entradas de linha de comando, mas não vejo qual outra escolha eu tenho.

Do que eu li aqui , é possível dizer a um serviço para usar o TTY para stdin e stdout , e então eu acho que configurei meu serviço para fazer exatamente isso:

[Unit]
Description=My Service
[email protected]

[Service]
Type=simple
ExecStart=/path/to/my/service
StandardInput=tty
StandardOutput=tty
TTYPath=/dev/tty2
TTYReset=yes
TTYVHangup=yes
Restart=always
RestartSec=5
User=username

[Install]
WantedBy=multi-user.target

Uma vez que meu serviço está rodando (e sim, ele está definitivamente rodando), eu tento usar o comando screen no PuTTY para ver /dev/tty2 como descrito em esta resposta :

sudo screen /dev/tty2

No entanto, quando faço isso, tudo que vejo no PuTTY é uma tela em branco sem saída com a qual não posso interagir. (E sim, o programa gera bastante saída durante a execução).

Portanto, não tenho certeza de onde estou errado, seja na configuração do serviço, no uso do comando screen ou no próprio PuTTY. Eu não sou um usuário super experiente do Linux em geral e esta é minha primeira vez fazendo qualquer coisa com o TTY, então meu entendimento é bem pequeno.

    
por Walt D 11.01.2018 / 23:01

1 resposta

1

Isso é totalmente não testado (ainda), pode funcionar.

Depois de efetuar login (via SSH com PuTTY ou qualquer outro), inicie uma nova sessão tmux (eu uso tmux , mas você pode escolher screen ), como se você quisesse trabalhar em um shell dentro dele. O comando simples tmux funcionará, mas vamos nomear a sessão:

tmux new-session -s foo

Em seguida, encontre o PID do seu service :

pidof service

e use reptyr para anexá-lo ao seu terminal atual que está dentro de tmux (eu acho que você pode precisar de sudo também). Veja esta minha resposta para características curtas de reptyr e o que fazer para que funcione.

reptyr <pid>

Se você quiser sair, primeiro desanexe de tmux com Ctrl + B , D (para screen é < kbd> Ctrl + A , D ). Mais tarde você pode retornar a esse terminal com

tmux attach-session -t foo

Portanto, não é necessário usar reptyr novamente até a próxima reinicialização.

Se eu fosse você, tentaria executar o serviço dentro de tmux em primeiro lugar, espero que isso seja diretamente vinculado ao TTY fornecido por tmux sem as configurações systemd relacionadas a TTY. Veja isto: Como executar tmux / screen com systemd > 230?

Algo como:

…
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/bin/tmux new-session -d -s foo /path/to/my/service
User=username
…

Se isso funcionar, você precisará executar tmux attach-session … como o usuário certo:

sudo -u username tmux attach-session -t foo
    
por 12.01.2018 / 01:48