screen后台运行程序

用screen 在后台运行程序

我们常需要SSH 或者telent 远程登录到Linux 服务器,经常运行一些需要很长时间才能完成的任务,在此期间不能关掉窗口或者断开连接,否则这个任务就会被杀掉,一切半途而废了。这时,我们可以用screen命令解决这个问题。

screen命令可以实现当前窗口与任务分离,我们即使离线了,服务器仍在后台运行任务。当我们重新登录服务器,可以读取窗口线程,重新连接任务窗口。

一:主要功能

会话恢复

只要Screen本身没有终止,在其内部运行的会话都可以恢复。这一点对于远程登录的用户特别有用——即使网络连接中断,用户也不会失去对已经打开的命令行会话的控制。只要再次登录到主机上执行screen -r就可以恢复会话的运行。同样在暂时离开的时候,也可以执行分离命令detach,在保证里面的程序正常运行的情况下让Screen挂起(切换到后台)。这一点和图形界面下的VNC很相似。

多窗口

在Screen环境下,所有的会话都独立的运行,并拥有各自的编号、输入、输出和窗口缓存。用户可以通过快捷键在不同的窗口下切换,并可以自由的重定向各个窗口的输入和输出。Screen实现了基本的文本操作,如复制粘贴等;还提供了类似滚动条的功能,可以查看窗口状况的历史记录。窗口还可以被分区和命名,还可以监视后台窗口的活动。

会话共享

Screen可以让一个或多个用户从不同终端多次登录一个会话,并共享会话的所有特性(比如可以看到完全相同的输出)。它同时提供了窗口访问权限的机制,可以对窗口进行密码保护。

GNU’s Screen 官方站点:http://www.gnu.org/software/screen/

二:screen 的使用

1,安装

1)一般的linux系统都会自带screen,如果没有安装的话,使用

yum -y install screen

2)语法
$> screen [-AmRvx -ls -wipe][-d <作业名称>][-h <行数>][-r <作业名称>][-s ][-S <作业名称>]

-A  将所有的视窗都调整为目前终端机的大小。
-d <作业名称>  将指定的screen作业离线。
-h <行数>  指定视窗的缓冲区行数。
-m  即使目前已在作业中的screen作业,仍强制建立新的screen作业。
-r <作业名称>  恢复离线的screen作业。
-R  先试图恢复离线的作业。若找不到离线的作业,即建立新的screen作业。
-s  指定建立新视窗时,所要执行的shell。
-S <作业名称>  指定screen作业的名称。
-v  显示版本信息。
-x  恢复之前离线的screen作业。
-ls或--list  显示目前所有的screen作业。
-wipe  检查目前所有的screen作业,并删除已经无法使用的screen作业。

2,新建窗口

新建一个窗口有3种方法:

screen 这样就可以新建窗口,进入到一个窗口中,但是这样窗口就没有名字,无法区分他们

screen -S name 这样新建一个名字为name的窗口,并入到该窗口中

例如:screen -S count 新建了一个叫count的窗口并进入,可以开始执行命令

例如:screen python ./a.py 新建并执行a.py程序

3,会话分离

我们在一个窗口运行某个程序之后,想退出登录关闭screen进入的窗口干点别的事,让程序在后台运行。这时就需要和窗口会话分离,有2种方式:

1)快捷键Ctrl a表示进入命令模式

在当前会话窗口中按Ctrl a +d快捷键可以实现分离,这时窗口会弹出[detached]的提示,并回到主窗口。

2)screen -d name #远程detach某个session,前提是已经跳出了name窗口

这样妈妈再也不用担心我们关掉terminal程序就不运行了。

4,恢复会话窗口

首先查看有哪些窗口正在运行

screen -ls #列出窗口列表 显示如下

There are screens on:
1942.cout (Detached)
1848.name (Dead ???)
Remove dead screens with ‘screen -wipe‘.
2 Sockets in /var/run/screen/S-root.

screen -r 1942 #进入1942线程,恢复count会话窗口 或 screen -r count

这样就能回到count窗口了

5,杀死会话窗口

如果想关掉一个多余的窗口,有3种方法:

1)kill -9 1848 例如在上面的2637,kill -9 1848 即可杀死线程,当然就杀死了窗口

2)使用Ctrl a +k 杀死当前窗口和窗口中运行的程序

3)使用Ctrl a 然后输入quit命令退出Screen会话。需要注意的是,这样退出会杀死所有窗口并退出其中运行的所有程序

6,清除死去的窗口

当窗口被杀死后,再用screen -ls 可以看到该窗口后面的(???dead)字样,说明窗口死了,但是仍在占用空间。这时需要清除窗口

screen -wipe #自动清除死去的窗口

这样的窗明几净了~

三:screen 的其他参数及应用

在每个screen session 下,所有命令都以 ctrl+a(C-a) 开始。

C-a ? -> 显示所有键绑定信息

C-a c -> 创建一个新的运行shell的窗口并切换到该窗口

C-a n -> Next,切换到下一个 window

C-a p -> Previous,切换到前一个 window

C-a 0..9 -> 切换到第 0..9 个 window

Ctrl+a [Space] -> 由视窗0循序切换到视窗9

C-a C-a -> 在两个最近使用的 window 间切换

C-a x -> 锁住当前的 window,需用用户密码解锁

C-a d -> detach,暂时离开当前session,将目前的 screen session (可能含有多个 windows)

丢到后台执行,并会回到还没进 screen 时的状态,此时在 screen session 里,每个 window 内运行的 process

(无论是前台/后台)都在继续执行,即使 logout 也不影响。

C-a z -> 把当前session放到后台执行,用 shell 的 fg 命令则可回去。

C-a w -> 显示所有窗口列表

C-a t -> time,显示当前时间,和系统的 load

C-a k -> kill window,强行关闭当前的 window

C-a [ -> 进入 copy mode,在 copy mode 下可以回滚、搜索、复制就像用使用 vi 一样

C-b Backward,PageUp

C-f Forward,PageDown

H(大写) High,将光标移至左上角

L Low,将光标移至左下角

0 移到行首

$ 行末

w forward one word,以字为单位往前移

b backward one word,以字为单位往后移

Space 第一次按为标记区起点,第二次按为终点

Esc 结束 copy mode

C-a ] -> paste,把刚刚在 copy mode 选定的内容贴上

screen 高级应用

会话共享

还有一种比较好玩的会话恢复,可以实现会话共享。假设你在和朋友在不同地点以相同用户登录一台机器,然后你创建一个screen会话,你朋友可以在他的终端上命令:

[[email protected] ~]# screen -x 这个命令会将你朋友的终端Attach到你的Screen会话上,并且你的终端不会被Detach。这样你就可以和朋友共享同一个会话了,如果你们当前又 处于同一个窗口,那就相当于坐在同一个显示器前面,你的操作会同步演示给你朋友,你朋友的操作也会同步演示给你。当然,如果你们切换到这个会话的不同窗口 中去,那还是可以分别进行不同的操作的。

会话锁定与解锁

Screen允许使用快捷键C-a s锁定会话。锁定以后,再进行任何输入屏幕都不会再有反应了。但是要注意虽然屏幕上看不到反应,但你的输入都会被Screen中的进程接收到。快捷键C-a q可以解锁一个会话。

也可以使用C-a x锁定会话,不同的是这样锁定之后,会话会被Screen所属用户的密码保护,需要输入密码才能继续访问这个会话。

发送命令到screen会话

在Screen会话之外,可以通过screen命令操作一个Screen会话,这也为使用Screen作为脚本程序增加了便利。关于Screen在脚本中的应用超出了入门的范围,这里只看一个例子,体会一下在会话之外对Screen的操作:

[[email protected] ~]# screen -S sandy -X screen ping www.baidu.com 这个命令在一个叫做sandy的screen会话中创建一个新窗口,并在其中运行ping命令。

原文地址:https://blog.51cto.com/14535577/2443779

时间: 2024-08-11 07:58:40

screen后台运行程序的相关文章

screen &amp; tmux 技巧:linux后台运行程序

通俗简介: screen 简单应用: screen myprogram // 通过screen启动一个程序, 或者screen -L myprogram: turns on logging to ~/screenlog.0 ctr+a 然后再按一下 d // 使程序在后台运行,即detach screen -ls // 列出在screen后台运行的程序,以及ID(例如4491.pts-2.localhost) screen -r ID // 恢复运行程序到terminal,例如:screen -

angularJS开启服务器后台运行程序,找不到scripts/web-server.js

学习angularJS时,教程里说使用node scripts/web-server.js开启服务器后台运行程序.一直出错.后来发现原因是这是老版本里的命令.现在都是用sudo npm start就可以了 运行完sudo npm start,再开启karma测试 sudo npm test 然后再浏览器中输入http://localhost:8000/app/index.html即可访问angularJS教程里的index.html. angularJS开启服务器后台运行程序,找不到script

五、清理mac缓存和关闭后台运行程序

一.清理mac 缓存  1.用鼠标点击桌面,然后按快捷键Command+Shift+G前往文件夹 2.输入路径:~/Library/Caches/ 3.清除所有的数据,把所有的Caches文件夹得都行都删除 二.关闭后台运行程序 1.打开Launchpad中的活动监视器 2.双击可以退出,正在运行的程序

shell 后台运行程序

shell 后台运行程序 http://blog.csdn.net/courage89/article/details/10561041 & 最经常被用到 这个用在一个命令的最后,可以把这个命令放到后台执行 ctrl + z 可以将一个正在前台执行的命令放到后台,并且暂停 jobs 查看当前有多少在后台运行的命令 fg 将后台中的命令调至前台继续运行 如果后台 中有多个命令,可以用 fg %jobnumber将选中的命令调出,%jobnumber是通过jobs命令查到的后台正在执行的命令的序号(

后台运行程序screen or nohup

后台运行 方法1 & ? 方法2:screen screen –S lnmp à起个名字 进去后运行程序 Ctrl+ad à退出lnmp屏幕 Scree –ls à查看 Screen –r xxx à进入屏幕 常用命令: screen -S yourname -> 新建一个叫yourname的sessionscreen -ls -> 列出当前所有的sessionscreen -r yourname -> 回到yourname这个sessionscreen -d yourname

linux后台运行程序(secureCRT断掉或关闭后继续运行程序)

secureCRT断掉后想继续运行程序.也就是程序会在后台一直执行到结束. secureCRT通过ssh联接到client端运行程序,如果关掉窗口或者断开连接时,任务会被kill. 为了程序能够后台执行到结束: 1.可以用&: 比如 python test.py 改成 python test.py & 来调用执行. 2.另外,还有一种方式:通过ctrl+z.bg等一系列的命令,将已经在前台运行的作业放到后台执行: 如果一个作业已经在前台执行,可以通过ctrl+z将该作业放到后台并挂起.然后

[转] linux中巧用ctrl-z后台运行程序

背景: 最近在执行一些长时间程序的时候,老是一不小心忘了输入‘&’ , 结果终端就卡在那里了,很是郁闷 以前总是再新开一个终端. 今天翻看<鸟哥的linux私房菜>的时候,发现介绍vim的时候介绍了一个ctrl-z命令可以将当前的程序切到后台,很好用!可是怎么再切回去呢?搜了下,见下文: -----------转载自:http://blog.chinaunix.net/uid-10219166-id-2968756.html ----------- 以下是原文    假设你发现前台运行

linux后台运行程序

1.我们的程序只是普通程序而已,一般这种程序即使使用& 结尾,如果终端关闭,那么程序也会被关闭.为了能够后台运行,我们需要使用nohup这个命令,比如我们有个start.sh需要在后台运行,并且希望在 后台能够一直运行,那么就使用nohup:              nohup /root/start.sh & 2.jobs bg 未完待续

iOS开发之如何后台运行程序

首先判断是否支持多线程 UIDevice *device = [UIDevice currentDevice]; BOOL backgroundSupported = NO; if ([device respondsToSelector:@selector(isMultitaskSupported)]) { backgroundSupported = device.mulltitaskingSupported; } 声明你需要的后台任务Info.plist中添加UIBackgroundModes