Как изменить SYSIN и SYSOUT (режим curses) для фонового процесса на другой терминальный сеанс (экранная утилита)?

363
Simon Sobisch

В настоящее время я запускаю фоновый процесс, запущенный процессом deamon. Он не имеет терминала и работает нормально, так как не имеет экранного ввода-вывода. Он запускается через скрипт оболочки, который я могу изменить. Сценарий оболочки наследует среду демона, устанавливает дополнительные переменные среды и, наконец, запускает программу через exec $PROG arg1 "arg 2" 1>&2.

Для запуска этого в «режиме отладки» необходим ввод / вывод (режим curses).

Что я пробовал до сих пор:

  • exec screen -dmS FIXME $PROG arg1 "arg 2" приводит к не запускающейся программе с сообщением об ошибке «неверный дескриптор файла»
  • exec $PROG arg1 "arg 2" 1>/dev/pts/5 приводит к запуску программы, весь вывод можно увидеть в / dev / pts / 5, конечно ввод невозможен
  • exec $PROG arg1 "arg 2" 1>/dev/pts/5 <namedpipeприводит к запуску программы, все выходные данные можно увидеть в / dev / pts / 5, принимает входные данные echo stuff > namedpipeиз другого сеанса, но это нельзя использовать, поскольку все функциональные клавиши должны быть пригодными для использования.

«Очевидное» решение, о котором я подумал (но не получилось):

  • запустить экран в другой консоли screen -dmS "FIXME"
  • пусть фоновый процесс использует этот сеанс экрана через exec screen -S "FIXME" -X stuff "$PROG arg1 \"arg 2\" "(необходим перевод строки, он эмулирует нажатие Enterклавиши)
  • прикрепить к экрану через screen -r "FIXME"(присоединение работает)

Проблема здесь: Это только отправляет одну сессию в сеанс, который не работает, так как отсутствует полная среда (начиная с текущего каталога и далее со всеми переменными среды). [Редактировать: опубликовал возможное решение взломать как ответ (исходный вопрос до сих пор остается без ответа)]

Вопрос: можно ли запустить фоновый процесс с помощью экранной утилиты? (Лучшим вариантом будет, если новый сеанс экрана будет запущен из фонового процесса [проблема здесь: у этого процесса вообще нет консоли], и просто подключиться из другого окна.

Если это невозможно: есть ли другие обходные пути?

1

1 ответ на вопрос

0
Simon Sobisch

Не отвечает на первоначальный вопрос, но, вероятно, работает в большинстве случаев:

  • хранить все из среды, которая выглядит важной для временного файла
  • отправьте на экран следующие команды: перейдите в каталог, создайте временный файл, удалите временный файл, запустите программу

Код:

 rm some_env.$$ for e in $(env | grep "PATH\|WHATEVERISIMPORTANT") do  echo "$e" >> some_env.$$ done exec screen -S "FIXME" -X stuff "cls cd $(pwd) . some_env.$$ rm . some_env.$$ $PROG arg1 \"arg 2\" " 

Похожие вопросы