您如何从屏幕会话中编写 gnu screen 脚本以打开新窗口并在其中运行命令?

Posted

技术标签:

【中文标题】您如何从屏幕会话中编写 gnu screen 脚本以打开新窗口并在其中运行命令?【英文标题】:how do you script gnu screen from within a screen session to open new windows and run commands in them? 【发布时间】:2010-01-28 16:55:16 【问题描述】:

在屏幕会话中,我想运行一个打开的 shell 脚本 同一会话中的几个新屏幕窗口并开始运行一些 程序。

我需要这样的脚本:

screen -t newWindow
[switch to newWindow and execute a command]
screen -t newWindow2
[switch to newWindow2 and execute a command]

我不知道如何实现我在括号中描述的效果。 有什么线索吗?请注意,这不是我将运行以开始屏幕会话的脚本。我需要此脚本可在现有屏幕会话中运行,以便将新窗口添加到会话中。

【问题讨论】:

【参考方案1】:

注意:您无法从屏幕会话中启动脚本工作。它会在会话中打开没有标签...它更多的是相关提示而不是问题的真正答案。

如果您接受通过运行进程来进行屏幕会话,还有其他解决方案......

新会话脚本

#!/bin/sh
echo "nouvelle session screen $sessionName"
screen -S $sessionName  init.sh
echo "screen session: done"
echo "go to $AnyWhere"
sleep 1
screenexec $sessionName "cd $AnyWhere"

初始化脚本(此处为“init.sh”)

#!/bin/zsh
zsh -c "sleep 0.2"
screen -d #detach the initialised screen
zsh       #let a prompt running

注入脚本(这里是screenexec)

#!/bin/sh
# $1 -> nom de screen cible  $2 -> commande
echo "injection de «$2» dans la session «$1» ..."
screen -x "$1" -X stuff "$2"              #inject the command
screen -x "$1" -X eval "stuff \015"       #inject \n
echo "Done"

通过使用这种方式,您应该可以轻松地在屏幕中注入代码,如果您的脚本表现得像一个守护进程,这会很有趣...

对于那些喜欢在 python 中编写脚本的人,我制作了一个小库来创建会话、关闭会话、注入命令:ScreenUtils.py

这是一个小项目,不处理多窗口屏幕会话。

忘了说我很久以前用它做了一个真正的python库:https://github.com/Christophe31/screenutils

【讨论】:

【参考方案2】:

在屏幕内运行此脚本可以满足我的要求:

#!/bin/bash

screen vi
screen top

【讨论】:

如果您在现有的屏幕会话中运行它似乎不起作用。 嗯。似乎在 Ubuntu Karmic 上使用“Screen version 4.00.03jw4 (FAU) 2-May-06”为我工作。摆脱我的.screenrc 以检查那里没有任何相关内容。跑screen 进行新会话。 C-a" 显示一个窗口 bash。 Ran ./aa.sh 就是上面的脚本。现在我看到viC-a" 列出了bashvitop 更一般地说,重要的是环境变量STY 的值。如果我运行screen -list 来查找我的会话的名称,然后从会话外部执行STY=32720.pts-1.lundy ./aa.sh,那么命令将在现有会话中启动。它在会话内部工作,因为STY 会自动设置;通过echo $STY 确认这一点。 但这并不适用于使用多个命令,例如screen -t newWindow cd ~/rails && script/server 将多个命令包装在一个子shell中:screen -t newWindow bash -c 'cd ~/rails && script/server'

以上是关于您如何从屏幕会话中编写 gnu screen 脚本以打开新窗口并在其中运行命令?的主要内容,如果未能解决你的问题,请参考以下文章

在启动脚本中使用屏幕

如果 Screen 被分离,GNU Screen 中的 Python 最终会变得空闲

如何让 GNU-Screen 为所有用户共享 1 个屏幕?

如何强制从另一个 SSH 会话中分离屏幕?

Linux屏幕打开会话并更改目录

如何列出正在运行的屏幕会话?