Перенаправить xterm на фон для безголовой машины

У меня есть приложение, которое запускает xterm и выводит логи uart. Я могу видеть, как он запускается и сбрасывает журналы в графическом интерфейсе. Однако, используя удаленный сеанс, я хочу, чтобы вывод xterm выполнялся где-то как фоновый процесс, чтобы я мог переключаться туда и обратно в одном терминале.

Использование графического интерфейса

введите здесь описание изображения

Использование удаленного терминала (SSH)

$ xterm
xterm: Xt error: Can't open display: :0

Я пытался сделать что-то вроде, но не получилось -

alias xterm="/bin/bash -c"

Я не хочу иметь X forwarding и запускать окно на моей локальной машине.


person Tom Iv    schedule 20.03.2021    source источник
comment
запустите X-сервер в фоновом режиме - vnc-сервер и подключитесь к vnc-клиенту.   -  person KamilCuk    schedule 21.03.2021
comment
спасибо.. но это для автоматизации, я хочу, чтобы это было доступно в командной строке   -  person Tom Iv    schedule 28.03.2021
comment
Управляете ли вы (можете ли вы изменять) приложение, которое запускает xterm?   -  person weirdan    schedule 28.03.2021
comment
I want it to be available on the command line тогда вам нужно xterm? Логи - это просто текст. Что это за приложение? Что делает приложение? Как он запускает xterm? Что отображается в xterm? Этот trying 127.0.0.1 выглядит как сессия телнета - это телнет? Почему бы не рассказать нам? И это отладчик jtag?   -  person KamilCuk    schedule 28.03.2021
comment
Действительно взгляните на screen, как предлагает @jurez. Вы можете дать каждому экранному сеансу имя (-S? ) and recall(-r`) из любой другой оболочки в вашей системе. Поэтому вместо xterm позвольте вашей программе открывать экран. Не объезжайте через X.   -  person blubase    schedule 31.03.2021


Ответы (2)


Если вам нужны только журналы, вам, скорее всего, не нужен X-сервер или xterm.

Вы можете просто запустить саму целевую команду. Судя по вашему снимку экрана, команда может быть telnet 127.0.0.1 <port_number>. Вы можете найти его в скрипте, который запускает ваше приложение, или с помощью ps -ef во время его работы. Если это UART, то вы также можете использовать minicom или socat для прямого подключения к последовательному порту без каких-либо дополнительных программ. Таким образом, вам даже не понадобится telnet.

Вы можете комбинировать эту команду с screen или tmux, чтобы она работала в фоновом режиме, и вы могли переключаться на нее с любого терминала или консоли. Просто запустите screen без аргументов, затем запустите команду на виртуальном экране. Отсоедините с помощью CTRL-a d, и ваша команда продолжит работу в фоновом режиме, готовая к повторному подключению к ней в любое время с помощью screen -r.

Кроме того, screen также может напрямую подключаться к последовательному порту, поэтому вы получаете два по цене одного.

Дело в том, что xterm не будет писать логи никуда, кроме как в графический буфер, да и там они будут только в виде мигающих пикселей, что не годится ни для какой обработки. Если вы настаиваете на том, чтобы идти по этому пути, у вас есть несколько вариантов:

  • Измените скрипт, который запускает приложение (может быть невозможно в зависимости от вашей ситуации)
  • Замените /usr/bin/xterm вашим фиктивным скриптом, который просто запускает bash вместо xterm и перенаправляет вывод в файл (уродливо, но вы, вероятно, могли бы избежать поломки других приложений, изменив PATH и поместив его в другое место). В своем скрипте вы можете использовать функции перенаправления bash, такие как >, или передавать вывод на tee.
  • Запустите сервер VNC в фоновом режиме и установите переменную среды DISPLAY при запуске приложения на номер виртуального экрана. В этом случае любые окна из приложения будут открываться на виртуальном экране VNC, и вы сможете подключаться к нему по своему усмотрению.
  • Используйте xvfb в качестве фиктивного X-сервера и комбинируйте его с ведением журнала xterm и т. д.
person jurez    schedule 28.03.2021

Решение 1. Поддельный xterm в системах без X11
Вы также можете создать скрипт-оболочку, который заменяет xterm другой функцией. Проверьте это на ноутбуке с X11:

$ function xterm {
echo "hello $@"
}
$ xterm world 1
hello world 1
$ export -f xterm
$ /bin/xterm          # opens a new xterm session
$ xterm world 2       # commands executed in second terminal
hello world 2

Это означает, что вы заменили команду xterm на функцию во всех дочерних процессах.

Теперь, если вы уже знаете, что ваш скрипт будет работать в терминале без xterm, вы можете создать функцию, которая принимает все параметры и выполняет ее. Нет необходимости в сложных экранных вещах или замене /usr/bin/xterm.

Решение 2. Создание дампа данных UART для winz
Если вы хотите сохранить все данные UART в файл, это легко исправить, создав сеанс экрана и файл журнала. Ниже команда создаст сеанс с именем myscreensessionname, который прослушивает последовательное соединение /dev/ttyUSB0 и записывает свои данные в /home/$USER/myscreensessionname.log.

$ screen -dmS myscreensessionname -L -Logfile /home/$USER \
/myscreensessionname.log /dev/ttyUSB0 115200

Обратите внимание, что если вы собираетесь использовать сеансы с несколькими экранами, вы можете использовать серийные идентификаторы вместо /dev/ttyUSB0. Вы можете идентифицировать связи с udevadmin следующим образом.

$  udevadm info --name=/dev/ttyUSB0 | grep 'by-id'
S: serial/by-id/usb-FTDI_TTL232R-3V3_FTBDBIQ7-if00-port0
E: DEVLINKS=/dev/serial/by-id/usb-FTDI_TTL232R-3V3_FTBDBIQ7-if00-port0 /dev/serial/by-path/pci-0000:00:14.0-usb-0:4.4.4.1:1.0-port0

Здесь вместо /dev/ttyUSB0 я бы использовал /dev/serial/by-id/usb-FTDI_TTL232R-3V3_FTBDBIQ7-if00-port0.

РЕДАКТИРОВАТЬ:
Вы можете прикрепить сеанс экрана с помощью следующей команды. В сеансе экрана нажмите crtl+a и нажмите d, чтобы отсоединиться.

$ screen -Dr myscreensessionname

Чтобы просмотреть все сеансы экрана:

$ screen -list
There is a screen on:
        2382.myscreensessionname        (04/02/2021 10:32:07 PM)        (Attached)
1 Socket in /run/screen/S-user.
person Bayou    schedule 02.04.2021