欢迎来到资源库(www.zyku.net)

Linux

当前位置:首页 > 服务器教程 > Linux > nohup命令

nohup和screen的比较

时间:2022-09-17|栏目:Linux|点击:|我要投稿

在实际工作中,我们ssh等到远程的Linux上,运行一个程序,但是当我们关闭掉我们的连接终端断开ssh后,刚才运行着的程序也会自动被中断结束。

当ssh连接断开后,如何让我们的程序继续在后台运行呢?下面介绍我常使用的两个方法。

A、使用nohup让程序在后台继续运行

常用命令:

# nohup /scripts/test.sh > testlog.log  &     #如果没有自定义重定向输出信息,运行成功后默认会将标准输出重定向到当前目录的nohup.out文件中

当需要将nohup后台运行的程序调到前台时,先jobs命令查看后台job编号,用 fg %n命令可以调回到前台运行(n是job的编号)。例如:

[root@centos1152 ~]# nohup /root/cp11.sh > cp11.log &      #回车后脚本开始后台执行

[1] 3485

[root@centos1152 ~]#  jobs

[1]+  Running                 nohup /root/cp11.sh > cp11.log &

[root@centos1152 ~]#  fg  %1   

nohup /root/cp11.sh > cp11.log     #回到job 1会话中了

Last login: Sat Jun  9 23:07:03 2012 from 192.168.11.100

如果此时突然ssh断开了,那么再登陆到系统的时候,执行jobs就不会发现刚才的job的编号了。但是job脚本会继续执行,直到完成脚本的内容。

[root@centos1152 ~]# jobs    #不会发现刚才的job的编号了

[root@centos1152 ~]#

另外:没有使用nohup的单独的&时可以让命令后台运行的,但是如果ssh会话断掉,&的命令也会自动退出。

例如:

[root@centos1152 ~]#  /root/cp11.sh > cp11.log &   #如果ssh会话突然断开的话,这个脚本就中断执行。

B、screen让程序后台执行——一个强大的工具

简单来说,Screen是一个可以在多个进程之间多路复用一个物理终端的窗口管理器。Screen中有会话的概念,用户可以在一个screen会话中创建多个screen窗口,在每一个screen窗口中就像操作一个真实的telnet/SSH连接窗口那样。在screen中创建一个新的窗口有这样几种方式:

1.直接在命令行键入screen命令

[root@centos1152 ~]#  screen

Screen将创建一个执行shell的全屏窗口。你可以执行任意shell程序,就像在ssh窗口中那样。在该窗口中键入exit退出该窗口,如果这是该screen会话的唯一窗口,该screen会话退出,

否则screen自动切换到前一个窗口。

2.Screen命令后跟你要执行的程序。

[root@centos1152 ~]#   screen  vi  test.c

Screen创建一个执行vi test.c的单窗口会话,退出vi将退出该窗口/会话。

3.以上两种方式都创建新的screen会话。我们还可以在一个已有screen会话中创建新的窗口。在当前screen窗口中键入Ctrl+a+c,即Ctrl键+a键,之后再按下c键,screen 在该会话内生

成一个新的窗口并切换到该窗口。给screen发送命令使用了特殊的键组合Ctrl+a。这是因为我们在键盘上键入的信息是直接发送给当前screen窗口,必须用其他方式向screen窗口管理器发出命令,默认情况下,screen接收以Ctrl+a开始的命令。这种命令形式在screen中叫做键绑定(key binding),Ctrl-a叫做命令字符(command character)。

可以通过Ctrl+a+?来查看所有的键绑定,我常用的键绑定有:

Ctrl+a+?    显示所有键绑定信息

Ctrl+a+d    暂时断开screen会话

Ctrl+a+k    杀掉当前窗口

Ctrl+a+w    显示所有窗口列表

我的通常的真实使用场景如下:

ssh登录我的Linux服务器,

[root@centos1152 ~]# screen        #进入screen窗口

[root@centos1152 ~]#  ./cp11.sh    #运行一个shell脚本,然后按键Ctrl+a+d(先按Ctrl+a 再按d键)暂时断开screen会话;然后干别的事情(散步)去了(可能ssh连接已经被断开)。

过一会儿,回来重新登录ssh,然后:

[root@centos1152 ~]#  screen -ls     #显示所有的 screen sessions (Ctrl-a d后的session为detached状态)

[root@centos1152 ~]#  screen -ls

There are screens on:

4102.pts-3.centos1152   (Detached)

[root@centos1152 ~]#   screen   -r  4102      #找到我想要 screen session也就是4102恢复回来 (捡回来)

另外: screen功能很强大的,我通常也就使用了上面的基本功能。更多的,请看参考资料或者man screen。

总结:

1、使用nohup command & 方式时,如果ssh突然断开了,那么再登陆到系统的时候,执行jobs就不会发现刚才的job的编号了。但是command会继续执行,直到完成脚本的内容。

2、使用screen方式执行脚本,然后按键Ctrl+a+d暂时断开后,即使ssh会话断了,使用screen -r也是能恢复到之前的会话中的。当然脚本内容也会直到执行完成。

(资源库 www.zyku.net)

原文链接:https://blog.csdn.net/jadesuper6/article/details/8094181

上一篇:shell中&&和||的用法

栏    目:Linux

下一篇:返回列表

本文标题:nohup和screen的比较

本文地址:https://www.zyku.net/linux/12101.html

关于我们 | 版权申明 | 寻求合作 |

重要申明:本站所有的文章、图片、评论等内容,均由网友发表或上传并维护或收集自网络,仅供个人学习交流使用,版权归原作者所有。

如有侵犯您的版权,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

联系QQ:95148658 | 邮箱:mb8#qq.com(#换成@)

苏ICP备2020066115号-1

本网站由提供CDN加速/云存储服务