nohup和screen的比较

在实际工作中,我们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也是能恢复到之前的会话中的。当然脚本内容也会直到执行完成。





更多参考:

AIX mount RedHat的NFS

误删除/dev/dsk 和/dev/rdsk 下的文件怎么办?

unary operator expected

bash: /root/.bash_profile: line 15: syntax error: unexpected end of file

Linux下如何查看文件秒级修改及访问时间

EM乱码解决

linux里端口转发

windows xp 下使用FileZilla密钥

java.net.SocketException: Too many open files 问题的解决办法

UNExcepted inconsistency; run fsck manually

如何修改linux的mac地址?

mysqldump: Got error: 1066: Not unique table/alias

rsync详解一

rsync详解二

更改mysql的默认安装目录

httpd: apr_sockaddr_info_get() failed for centos1113

Real domain name required for sender address

Connection refused by [127.0.0.1]

MySQL bin_log文件占用空间太大

Centos 5 多路径配置步骤

rpc mount export: RPC: Unable to receive; errno = No route to host

nohup和screen的比较

vmware workstation 8 共享磁盘



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值