подключиться к tty, запуская процесс

Вопрос или проблема

У меня есть файл службы systemd, который запускает java-программу в другом tty.

[Unit]
Description=java программа
After=network-online.target

[Service]
Type=simple
ExecStart=/usr/bin/java -cp "/home/user/someclass.jar"
Restart=always
RestartSec=10
StandardInput=tty-force
StandardOutput=inherit
StandardError=inherit
TTYPath=/dev/tty10
TTYVTDisallocate=yes
TTYReset=yes
TTYVHangup=yes

[Install]
WantedBy=multi-user.target

Программа ожидает ввода в tty, я могу переключиться на этот tty, используя Ctrl+Alt+F10 или команду chvt 10, и могу взаимодействовать с программой.

Теперь я хочу отправлять ввод и получать вывод из этого tty, не изменяя мой текущий tty. Я пытался использовать screen, и все, что я получаю, это пустой экран. Я пробовал использовать script, который успешно работает, если я запускаю bash в этом tty, но не работает, если я запускаю java-программу.

Функция PTY в socat может быть вашим лучшим вариантом для программного интерфейса с ресурсозатратными терминальными приложениями без дополнительной функциональности. Посмотрите примеры в странице руководства.

Кроме того, dtach предоставляет семантику повторного подключения, похожую на screen (многопользовательскую), для легкого доступа из эмулятора терминала.

Ответ или решение

Чтобы подключиться к TTY, на котором работает процесс, и отправлять ему команды без необходимости переключаться между TTY (например, TTY10, где запущен ваш Java-программный процесс), вы можете воспользоваться несколькими подходами. Рассмотрим эти варианты подробнее с использованием таких инструментов, как socat и dtach.

Использование socat для подключения к TTY

Socat — это мощный инструмент, который позволяет настраивать соединения между различными точками, в том числе организовывать взаимодействие с виртуальными терминалами (PTY). Чтобы отправить ввод в ваш Java-программный процесс и получить вывод из терминала, выполните следующие шаги:

  1. Установка socat (если он еще не установлен):

    sudo apt-get install socat
  2. Запуск socat:
    Для подключения к TTY используйте следующую команду:

    socat -d -d pty,raw,echo=0,link=/tmp/mysocat pty,raw,echo=0

    Эта команда создаст виртуальную точку PTY (например, /tmp/mysocat), к которой вы сможете подключаться.

  3. Перенаправление ввода/вывода:
    Вам нужно будет перенаправить stdin, stdout и stderr вашего процесса в созданный PTY. Сделайте это через screen или другой подходящий способ для реализации управления вводом и выводом в вашем Java-приложении.

  4. Подключение к созданному PTY:
    Теперь вы можете открыть новое TTY, например, в xterm или обычном терминале:

    xterm -e socat /tmp/mysocat -

    Это запустит xterm и подключит его к PTY, созданному ранее.

Использование dtach

Dtach — это еще один инструмент, который может оказаться полезным для управления TTY-сессиями. Он позволяет отсоединять экран и позже повторно подключаться к нему.

  1. Установка dtach:

    sudo apt-get install dtach
  2. Запуск Java-программы с dtach:
    Запустите вашу Java-программу внутри dtach:

    dtach -n /tmp/dtach-$$.sock java -cp "/home/user/someclass.jar"

    Где $$ — это идентификатор текущего процесса. Вы можете интегрировать этот вызов в ваш service-файл systemd, изменив ExecStart.

  3. Подключение к dtach-сессии:
    Чтобы подключиться к сессии позже, выполните:

    dtach -a /tmp/dtach-<pid>.sock

Окончание

Теперь у вас есть два мощных подхода для работы с Java-программой в TTY, не меняя текущий терминал. Оба метода имеют свои преимущества: socat отлично подходит для работы с данными в PTY, тогда как dtach упрощает процесс отсоединения и повторного подключения к сессиям. На вашем усмотрении вы можете выбрать подход, который будет наиболее подходящим для вашей задачи.

Оцените материал
Добавить комментарий

Капча загружается...