`
marlonyao
  • 浏览: 252677 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

gnu screen脚本相关

阅读更多
这里不会介绍如何使用Screen,只是记录我从脚本创建并操纵Screen会话(session)的一些尝试。 如果想看Screen的一些入门介绍,可以看这里,还有一个quick reference,很有用。

当要同时维护或开发多个项目时,我的习惯是每个项目一个screen会话,每个会话中打开多个窗口。切换项目时,先detach当前session,然后attach另一个项目的session,保持只打开一个控制台窗口,将不必要的窗口或应用程序关闭或隐藏是我的习惯。但总是要来回切换session,有时就显得比较麻烦,第一次切换需要先创建session,每个session基本上都要先启动一个django web服务器,这要好几个步骤,先cd相应目录,然后用virtualenv切换到python虚拟环境,然后再输入"python manage.py runserver"启动服务器,视情况最后还要启动一个vim以及一个ipython终端。整个过程挺麻烦,容易出错,作为一个很懒的程序员,就想通过bash脚本来自动完成这些操作。

写screen脚本并不那么简单,直接将交互控制台下的命令复制到脚本中并不起作用:

#!/bin/bash
cd ~/projects/light		# 切换到项目根目录
screen -R light			# 开启一个新的screen session,命名为light
workon light
python manage.py runserver


脚本运行到第3行会开启一个screen会话,但这条命令并没有完成,只有等待screen会话退出或detach它才结束,然后能才能执行后面的命令。这样,后续的命令并不是在screen会话中执行,而是直接在实际terminal中执行,这当然不是我们想要的。一个解决方法是创建一个detach的session,然后通过screen -X向session发送命令。

#!/bin/bash
cd ~/projects/light			# 切换到项目根目录
screen -dmS light			# 创建一个detached session
screen -S light -p bash -X title server		# 将window标题从默认的bash改成server
screen -S light -p server -X stuff $'workon light\n'	# 执行workon light命令
screen -S light -p server -X stuff $'python manager.py runserver\n'	# 启动服务器
screen -r light				# attch会话


第3行选项-dmS创建一个detached的会话,第4行将默认的window标题从bash改成server,-S选项指定session名称,-p选项选择指定window名称,-X选择执行screen命令,这里执行是修改标题命令。第5行执行screen的stuff命令,相当于你在交互式screen中输入命令"workon light",接着第6行启动服务器。最后一行attach会话。

我们还可以做得更智能,我们可以检测screen会话是否已经存在,如果已经存在则直接attach该会话。

screen_light() {
	if [[ $STY == *light* ]]; then		# 如果已经在会话中,不做事情
		return
	#elif [ -n "$STY" ]
	#    screen -S light -X detach
	fi
	if screen -ls | grep 'light' > /dev/null 2>&1; then
		screen -r light
		return
	fi
	cd ~/projects/light			# 切换到项目根目录
	screen -dmS light			# 创建一个detached session
	screen -S light -p bash -X title server		# 将window标题从默认的bash改成server
	screen -S light -p server -X stuff $'workon light\n'	# 执行workon light命令
	screen -S light -p server -X stuff $'python manager.py runserver\n'	# 启动服务器
	screen -r light				# attch会话
}
screen_light

第2行判断是否已经处于相应session中,是则直接返回。第6行判断是否已经存在相应的session,是则只需要重新attach此会话,否则创建新的会话。注意第3-4行被注释的部分,表示当处于其它session中时,先detach该会话,然后再attach需要的session,这似乎很符合逻辑,但不幸的是,这不起作用,因为即使你detach了该会话,剩下的命令仍然是在该会话中执行,最终的效果就是在一个screen会话中attach了另一个会话,即嵌套会话。总的说来,虽然可以向脚本向screen session发送命令,这已经可以做不少事情了,但要离完全用脚本操控screen还有很远,其主要限制有:

  1. 不能detach当前session,然后attach另一个session
  2. 不能获取某个session的所有window
  3. 不能获取某个session某个window正在执行的进程

如果能够做突破上述限制,我相信能够用script做更多事情。


最后说下screen的自动补全,我一直以为screen不带自动补全的,就想写一个自动全会话的脚本,后来发现它其实是有的,只不过补全的名称是如pid.name的形式,pid是个数字,这意味着必须输入数字才能补全,一点也不人性化,我对它的补全脚本做了点修改,使得能够补全名称。改动/etc/bash_complete.d/screen,修改_screen_sessions函数:

_screen_sessions()
{
   local pattern

   if [ -n "$1" ]; then
       pattern=".*$1.*"
   else
   pattern=".*"
   fi

   COMPREPLY=(
       $( command screen -ls | sed -ne
's|^['$'\t'']\+[0-9]\+\.\('"$cur"'[^'$'\t'']\+\)'"$pattern"'$|\1|p' )
       $( command screen -ls | sed -ne
's|^['$'\t'']\+\('"$cur"'[0-9]\+\.[^'$'\t'']\+\)'"$pattern"'$|\1|p' )
   )
}


[完]
分享到:
评论

相关推荐

    PyPI 官网下载 | gnu-screen-0.0.3.tar.gz

    在压缩包子文件的文件名称列表中,只有“gnu-screen-0.0.3”,这通常意味着解压后会得到一个包含源代码、文档、安装脚本等的目录结构。用户可能需要使用命令行工具如tar和gzip来解压缩,然后使用Python的setuptools...

    GNU Screen Interface-开源

    解压后,按照项目文档的指示运行相关脚本,即可体验到这个创新的控制台界面。 总的来说,GNU Screen Interface 将 GNU Screen 的强大功能与 PHP/Ncurses 的交互性相结合,为命令行用户带来了一个全新的体验。对于...

    minecraft-backup:在GNU Screentmux中运行Minecraft服务器Linux服务器的备份脚本

    《使用Bash脚本在GNU Screen中备份Minecraft Linux服务器》 Minecraft是一款深受全球玩家喜爱的沙盒建造游戏,而其服务器的稳定运行离不开定期的备份。在Linux环境中,我们可以利用Bash脚本和GNU Screen工具来实现...

    GNU Nano 2.5.3 编辑器源码

    主要的源文件可能有“main.c”(主程序入口)、“buffer.c”(缓冲区管理)、“screen.c”(屏幕更新)等。 2. **配置脚本**:如“configure”脚本,用于检查系统环境,配置编译选项,并生成Makefile。用户可以通过...

    Linux中screen命令及使用方法

    `screen`是由GNU项目开发的开源软件,它的主要功能是在命令行环境中提供多窗口管理。用户可以在不同的窗口之间轻松切换,同时进行多个任务,而无需频繁地打开和关闭终端。这对于开发者、系统管理员以及需要在终端...

    screen-dialog:用于启动 GNU 屏幕会话的对话框

    用法附加到您的 .screenrc 配置文件: screen -t menu 0 ${HOME}/bin/s-dialog.pl(相应地更改放置脚本的路径。)配置配置项将从 $HOME/.s.conf 以简单的 yaml 格式加载: ---screen : /usr/bin/screenssh : /usr/...

    mobaxterm shell最新版工具

    MobaXterm 还有很强的扩展能力,可以集成插件来运行 Emacs、Fontforge、Gcc, G++ and development tools、MPlayer、Perl、Curl、Corkscrew、 Tcl / Tk / Expect、 Screen、 Png2Ico 、 NEdit Midnight Commander 等...

    mcsMgr:mcsMgr是一个工具包,可让您在GNU屏幕上控制多个Minecraft Server会话

    mcsMgr 是一个专为Minecraft服务器管理员设计的工具包,它利用Python语言的强大功能,使得用户可以在GNU Screen环境中轻松管理和控制多个Minecraft服务器会话。这个工具极大地方便了多服务器环境下的日常维护工作,...

    screen_notify-开源

    screen_notify.rb-一个Ruby脚本,用于将消息添加到gnu屏幕的标题字段中。

    MinecraftServerManager:一组 python 和 shell 脚本,用于根据玩家在聊天中输入的命令控制我的世界服务器

    如果您还没有安装 GNU screen(在 debian/ubuntu 上: sudo apt-get install screen ) 打开gamemode.py并将变量serverFolderPath更改为您正在运行服务器的目录的绝对路径。 打开stopwatcher.py和变化的变量...

    liux指令

    `gtar`是一个GNU版本的tar命令,用于打包和压缩文件。 4. **`gtar -zxvf X.tar.gz`**:解压`X.tar.gz`包。 5. **`tail -f *.log`**:实时查看日志文件的更新。这对于监控系统或应用程序的日志非常有用,可以及时...

    jun-dotfiles:bash,screen,irssi等的个人点文件

    emacs,bash和GNU Screen的配置文件以及misc conf文件 当您git克隆此仓库时,请确保克隆到〜/ dotfiles中! 该脚本不需要以root身份启动,但是您应该执行以下命令 setfacl -m“ u:USERNAME:rwx” / root 这样您...

    dotfiles:我的配置文件由GNU Stow管理

    10. **`~/.sh`**:可能包含用户的shell脚本或其他Shell相关的设置。 标签“dotfiles Shell”表明这些配置主要与Unix-like系统的Shell环境和相关工具有关。通过良好的dotfiles管理,开发者可以创建一个高效且个性化...

    dotfiles:我为GNU Stow安排的dotfile

    这可能包括设置Python虚拟环境的脚本、Python解释器的别名或者特定的Python插件配置。例如,.bashrc文件中可能有激活虚拟环境的命令,或者.vimrc中可能有针对Python语法高亮和自动格式化的设置。 在压缩包子文件的...

    emacs-splash:GNU Emacs的替代启动屏幕

    用户可能需要编辑".emacs"或"init.el"配置文件,以加载emacs-splash的相关设置和脚本。 在Emacs配置文件中,你可以根据个人喜好调整启动屏幕的样式、颜色、显示信息等。这可能涉及设置变量、调用特定的Elisp函数,...

    linux免安装远程工具

    6. **终端复用**:通过tmux或GNU Screen这样的终端复用器,用户可以在单个终端窗口中管理多个会话。 7. **安全性**:MobaXterm支持SSH密钥对认证,增强了远程连接的安全性。 8. **免费与付费版本**:虽然MobaXterm...

    MobaXterm_Installer_v20.6.zip

    4. **终端复用**:通过tmux或者GNU Screen,用户可以在单个终端窗口中开启多个会话,提升工作效率。 5. **批处理命令**:支持预定义和保存的批处理脚本,一键执行一系列命令,特别适合日常维护任务。 6. **便携版*...

    LInux系统学习资料

    - 开源哲学:Linux遵循GNU/GPL许可证,代码开放,鼓励用户参与开发和改进。 - 发行版:Ubuntu、CentOS、Debian、Fedora等都是基于Linux内核的不同发行版,各有特色。 2. **Linux安装与启动流程** - 安装方式:...

    iphone4(ios7.1.2),逆向工具deb离线包

    Screen #screen tcpdump #tcpdump 11.iFile是一款文件管理工具. 12.MobileTerminal(注意没有空格)是开源的IOS版Terminal,注意:4以上系统都需要的是520-1版的mobile terminal,安装源是iPhoneCake源 ...

Global site tag (gtag.js) - Google Analytics