我目前运行由守护进程启动的后台进程。它没有终端,但工作正常,因为它没有任何屏幕输入/输出。它通过我可以更改的 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\"
"