2

Итак, у меня есть программа (которую я не написал и не могу изменить), которую я запускаю в качестве службы, используя systemd на моем облачном сервере Ubuntu 16.04. Он отлично работает, за исключением того, что мне нужно иметь возможность взаимодействовать с запущенной программой, и единственный способ, которым программа поддерживает взаимодействие с ним, - через stdin/stdout . Я понимаю, что для службы довольно нетрадиционно использовать только ввод из командной строки, но я не вижу другого выбора.

Из того, что я прочитал здесь, можно сказать службе использовать TTY для stdin и stdout , и поэтому я думаю, что настроил свой сервис именно на это:

[Unit]
Description=My Service
After=getty@tty2.service

[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

Когда мой сервис запущен (и да, он определенно работает), я пытаюсь использовать screen команду в PuTTY для просмотра /dev/tty2 как описано в этом ответе:

sudo screen /dev/tty2

Однако, когда я делаю это, все, что я вижу в PuTTY, это пустой экран без вывода, с которым я не могу взаимодействовать. (И да, программа генерирует много выходных данных во время работы.)

Так что я не уверен, где я ошибся, будь то в конфигурации службы, использовании команды screen или с самой PuTTY. Я не очень опытный пользователь Linux в целом, и я впервые делаю что-то с TTY, поэтому мое понимание довольно слабое.

1 ответ1

1

Это полностью не проверено (пока), может сработать.

После того, как вы войдете (через SSH с PuTTY или любым другим), запустите новый сеанс tmux (я использую tmux , но вы можете выбрать screen), как если бы вы хотели работать в оболочке внутри него. Обычная команда tmux будет работать, но давайте назовем сессию:

tmux new-session -s foo

Затем найдите PID вашего service:

pidof service

и используйте reptyr чтобы подключить его к вашему текущему терминалу, который находится внутри tmux (я думаю, вам также может понадобиться sudo ). Смотрите этот мой ответ для кратких характеристик reptyr и что нужно сделать, чтобы он работал.

reptyr <pid>

Если вы хотите выйти из системы, сначала отсоединитесь от tmux с помощью Ctrl+B, D (для screen это Ctrl+A, D). Позже вы можете вернуться к этому терминалу с

tmux attach-session -t foo

поэтому нет необходимости использовать reptyr снова до следующей перезагрузки.


Если бы я был вами, я бы сначала попытался запустить службу внутри tmux , я ожидаю, что это напрямую свяжет его с TTY, предоставленным tmux без настроек systemd связанных с TTY. Смотрите это: Как запустить tmux/screen с systemd > 230?

Что-то вроде:

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

Если это работает, вам нужно будет запустить tmux attach-session … как правильный пользователь:

sudo -u username tmux attach-session -t foo

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .