我正在考虑编写一个图形工具,它将向您显示您拥有哪些 gnu-screen 会话以及其中有哪些可用窗口。例如,您可以单击窗口标题,它会将您带到那里。我不想以任何方式修改 gnu-screen ,以便我的工具可以与其他机器上的现有安装一起使用等等。
我可以通过使用日志文件或将最后几行复制到交换缓冲区中,从屏幕会话中的屏幕内运行的程序中获取普通输出。为了制作一个漂亮的用户界面,我真正需要的是状态行(临时出现在窗口底部的行)的内容。例如,要获取会话中的窗口列表,我可以发送命令windowlist,但结果永远不会成为输出的一部分。有谁知道是否有一种方法可以让屏幕将其消息放入日志、粘贴缓冲区、当前窗口或任何类似的地方,我可以从另一个程序中获取它?
我一直在尝试接受 GNU Screen 中的脚本编写。阅读手册页和其他一些示例后,我了解到我们可以使用命令at或-X参数将命令发送到屏幕会话。
让我解释一下我的情况。我需要编写一个在现有屏幕会话中运行的脚本。该脚本应创建新窗口,设置其标题,浏览到特定目录并在每个窗口中运行程序。
该命令的问题at是我一次只能发送一个命令。当我使用命令创建新窗口时at,我将无法获取该新创建窗口的窗口号。因此,我将无法向该新窗口发送更多命令。如何检索这个新窗口的窗口号?
当在 SCREEN 内的会话中调用 vi 时,我总是遇到错误:
bash-3.2$ vi perf332.db2
ex: 0602-108 screen is not a recognized terminal type.
[Press return to continue]
[Using open mode]
Run Code Online (Sandbox Code Playgroud)
在我明确导出TERM=xterm或执行其他操作后,它工作正常。
我的 SCREEN 在 Linux 服务器上运行,我从那里通过 SSH 连接到 AIX 服务器。
我想以screen分离状态启动会话,以便它们在脚本完成后终止,这样我就可以编写一个脚本来执行多个screen会话,而无需手动逐一启动每个会话,然后分离,然后再继续到下一个屏幕会话。
该脚本取决于设置的某些环境变量。通常,当我screen在常规bashshell 之外运行此脚本时,我只需在我的文件中设置这些环境变量即可.bash_profile。
此外,当我以非分离状态启动屏幕并放入我的.screenrc文件时:
shell -$SHELL
那么我也没有问题。
仅当我执行时才会出现问题,screen -dm然后由于未设置我需要的环境,我的脚本无法运行。
在分离状态下启动时,如何告诉屏幕引用该.screenrc文件,以便它最终.bash_profile在启动时获取我的文件?
更新
当我执行时screen -dmL env,我可以看到一些但不是全部的环境变量都存在。
所以事实证明这对谷歌来说是一件非常困难的事情。我有一个工作设置,我可以在一天结束时休眠或关闭的笔记本电脑上运行所有内容。这样做显然会切断我在 puTTY 中的 SSH 会话。经过一番摸索,我发现了一种在通过 puTTY 连接时自动启动屏幕并获取断开连接的会话的好方法(即,添加if [ -z "$STY" ]; then screen -R; fi到我的 .bashrc 的末尾)。
这非常有效,但我仍然有问题。我使用 SSH 代理通过我的笔记本电脑上的 Pageant(我最初输入密码的地方)转发到辅助服务器。据我所知,当 puTTY 会话中断时,此套接字已损坏,并且在重新加载和重新连接到 screen时不会重新连接。
这是我的测试:
20:01:38 {~/test}$ git clone git@github.com:coldcandor/env.git
Cloning into 'env'...
remote: Counting objects: 1105, done.
remote: Total 1105 (delta 0), reused 0 (delta 0), pack-reused 1105
Receiving objects: 100% (1105/1105), 341.06 KiB | 453.00 KiB/s, done.
Resolving deltas: 100% (544/544), done.
Checking connectivity... done.
20:01:43 {~/test}$ rm -rf env
Run Code Online (Sandbox Code Playgroud)
断开油灰并重新连接
20:01:58 …Run Code Online (Sandbox Code Playgroud) 我有一个 Docker 容器在 AWS EC2 实例中运行,我通过 ssh 进入 EC2 实例,运行我的 docker 容器,并在 docker 容器中运行一个screen分离会话的脚本:
screen -dmS test my_script.sh
Run Code Online (Sandbox Code Playgroud)
在同一个终端内,我没有问题screen -x test。
但是,如果我现在打开一个新终端,通过 SSH 连接到 EC2 实例,进入 docker 容器 ( sudo docker exec -it container_id /bin/bash) 并运行,screen -x test我将收到错误消息:
Must be connected to a terminal.
Run Code Online (Sandbox Code Playgroud)
显示输出screen -ls:
There is a screen on:
2122.test (11/18/2016 09:45:50 AM) (Detached)
1 Socket in /var/run/screen/S-root.
Run Code Online (Sandbox Code Playgroud)
因此我无法从其他任何地方访问屏幕。任何帮助在这里表示赞赏。谢谢!
注意:我在 Google 和 SO 上看到了许多类似的问题,但是我能理解/尝试的所有回复都不适用于我的设置。
在 gnu-screen 会话中运行 ipython 5 和 6 时,粘贴多行不起作用。
如果我在正常的终端会话中运行 ipython,当我粘贴 3 个由换行符分隔的导入行时,我会看到以下内容:
In [1]: import datetime
...: import os
...: import glob
...:
...:
In [2]:
Run Code Online (Sandbox Code Playgroud)
如果我在 gnu-screen 会话中做同样的事情,我会看到:
In [1]: import datetime
In [2]:
Run Code Online (Sandbox Code Playgroud)
即,结果在第一个换行符处被截断。
是否有任何 ipython 或屏幕配置项可用于解决此问题并在两个终端中实现相同的粘贴行为?
编辑:此问题显然已在 ipython 邮件列表的某处报告,如在此问题中所引用。
screen 是我自己编译的少数软件之一。我发现它往往比存储库中的版本更好地支持终端的一些现代功能。我这样做已经有一段时间了,没有遇到太大问题。然而,升级到 18.04 后,(真实)颜色似乎已损坏。
我运行这段代码来打印彩虹,它仍然可以在裸机中工作:
awk 'BEGIN{
s="/\\/\\/\\/\\/\\"; s=s s s s s s s s;
for (colnum = 0; colnum<77; colnum++) {
r = 255-(colnum*255/76);
g = (colnum*510/76);
b = (colnum*255/76);
if (g>255) g = 510-g;
printf "\033[48;2;%d;%d;%dm", r,g,b;
printf "\033[38;2;%d;%d;%dm", 255-r,255-g,255-b;
printf "%s\033[0m", substr(s,colnum+1,1);
}
printf "\n";
}'
Run Code Online (Sandbox Code Playgroud)
但是,当我启动屏幕时,颜色消失了。它似乎并没有回落到 256 色,而是颜色值错误。
我在重新编译屏幕之前就看到了这种行为。看到这个问题后,我重新编译,甚至破坏了我的 git 存储库,并重新克隆和重新编译,试图让事情正常工作,但无济于事。
想一想这到底是哪里出了问题?我什至不确定哪个库可能对此负责,或者它如何与 konsole 但不与 screen 一起工作。
我正在使用 userdocker 在远程服务器上一个接一个地训练几个 Keras 模型。我通过 ssh 连接到服务器,让它们在不同的屏幕上运行。
为了加快速度,我在 5 个 GPU 上训练模型,以便同时训练 5 个不同的模型。
大多数情况下,模型训练没有任何问题:我分离屏幕,从服务器注销并让它们运行一夜。然而,有时他们会在培训过程中因管道破裂消息而停止。下面我包含了消息的最后一部分,因为我认为它可能是最相关的,但它很长且重复。
我发现这个问题有一个稍微相似的错误消息,他们链接到这个解释,但我看不出如何在我的情况下修复它,或者我在我的代码中犯了可能导致这个问题的错误并不总是发生。
有没有人在使用 Keras 或 userdocker 时遇到过类似的问题?怎样才能防止它发生?
错误信息
23/24 [==========================>..] - ETA:7s - 损失:1.7797 - acc:0.2219 Traceback(大多数最近调用最后一次):
文件“/usr/local/lib/python2.7/dist-packages/keras/utils/data_utils.py”,第 655 行,在 _data_generator_task self.queue.put((True, generator_output))
文件中",第 2 行,放入
文件 "/usr/lib/python2.7/multiprocessing/managers.py",第 759 行,在 _callmethod 类型中,结果 = conn.recv() EOFError进程 Process-259:回溯(最近一次调用):
文件“/usr/lib/python2.7/multiprocessing/process.py”,第 258 行,在 _bootstrap self.run()
文件“/usr/lib/python2. 7/multiprocessing/process.py", line 114, in run self._target(*self._args, **self._kwargs)
File "/usr/local/lib/python2.7/dist-packages/keras/utils/ data_utils.py”,第 665 行,在 _data_generator_task self.queue.put((False, e))
文件“”,第 2 行,输入文件“/usr/lib/python2.7/multiprocessing/managers.py”,行758, in …
有一个问题(sh screen - 等待屏幕终止)关于如何在继续之前等待屏幕会话终止。
该解决方案使用循环,但我认为不可能在系统服务脚本中使用循环。
目前我使用的是:
ExecStop=/usr/bin/screen -S starforge -p 0 -X stuff "stop^M"
ExecStop=/bin/sleep 10
Run Code Online (Sandbox Code Playgroud)
通常,我不需要整个 10 秒,但我需要某种方法来知道屏幕是否已经终止