如何将后台进程的 SYSIN 和 SYSOUT(curses 模式)更改为另一个终端会话(屏幕实用程序)?

如何将后台进程的 SYSIN 和 SYSOUT(curses 模式)更改为另一个终端会话(屏幕实用程序)?

我目前运行由守护进程启动的后台进程。它没有终端,但工作正常,因为它没有任何屏幕输入/输出。它通过我可以更改的 shell 脚本启动。shell 脚本继承守护进程的环境,设置其他环境变量,最后通过 启动程序exec $PROG arg1 "arg 2" 1>&2

为了在“调试模式”下运行它,屏幕 i/o 是必需的(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\"
"

相关内容