1

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

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

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

Код:

   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\"
"

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .