Вопрос или проблема
У меня есть файл службы 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-программный процесс и получить вывод из терминала, выполните следующие шаги:
-
Установка socat (если он еще не установлен):
sudo apt-get install socat
-
Запуск socat:
Для подключения кTTY
используйте следующую команду:socat -d -d pty,raw,echo=0,link=/tmp/mysocat pty,raw,echo=0
Эта команда создаст виртуальную точку
PTY
(например,/tmp/mysocat
), к которой вы сможете подключаться. -
Перенаправление ввода/вывода:
Вам нужно будет перенаправитьstdin
,stdout
иstderr
вашего процесса в созданныйPTY
. Сделайте это черезscreen
или другой подходящий способ для реализации управления вводом и выводом в вашем Java-приложении. -
Подключение к созданному PTY:
Теперь вы можете открыть новоеTTY
, например, вxterm
или обычном терминале:xterm -e socat /tmp/mysocat -
Это запустит
xterm
и подключит его кPTY
, созданному ранее.
Использование dtach
Dtach
— это еще один инструмент, который может оказаться полезным для управления TTY-сессиями. Он позволяет отсоединять экран и позже повторно подключаться к нему.
-
Установка dtach:
sudo apt-get install dtach
-
Запуск Java-программы с dtach:
Запустите вашу Java-программу внутриdtach
:dtach -n /tmp/dtach-$$.sock java -cp "/home/user/someclass.jar"
Где
$$
— это идентификатор текущего процесса. Вы можете интегрировать этот вызов в ваш service-файл systemd, изменивExecStart
. -
Подключение к dtach-сессии:
Чтобы подключиться к сессии позже, выполните:dtach -a /tmp/dtach-<pid>.sock
Окончание
Теперь у вас есть два мощных подхода для работы с Java-программой в TTY
, не меняя текущий терминал. Оба метода имеют свои преимущества: socat
отлично подходит для работы с данными в PTY
, тогда как dtach
упрощает процесс отсоединения и повторного подключения к сессиям. На вашем усмотрении вы можете выбрать подход, который будет наиболее подходящим для вашей задачи.