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

В настоящее время я запускаю фоновый процесс, запущенный процессом 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 ответ

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

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

Код:

   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\"
"
Другие вопросы по тегам