Как изменить 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\"
"