转载:http://blog.csdn.net/v1v1wang/article/details/6855552

对于linux运维,我们都是使用ssh登录到服务器,如果我们运行的任务需要很长时间或不间断运行,在我们直接关闭终端窗口或网络不稳定的情况下,任务就会中断,当然这只对于普通程序,不包括如mysqld,httpd这样的守护进程。
原因分析:

  1. [root@DigMouse ~]# ping 51osos.com > /dev/null &
  2. [1] 13678
  3. [root@DigMouse ~]# pstree -H 13678
  4. init-+-NetworkManager
  5. |-sshd---sshd---bash-+-ping
  6. |                    `-pstree

复制代码

当用户注销(logout)或者网络断开时,终端会收到 HUP(hangup)信号从而关闭其所有子进程。从上面的例子大家可以看出当前我们所处的 bash 是 sshd 的子进程,当 ssh 断开连接时,HUP 信号会影响到它下面的所有子进程,包括ping进程。
解决思路:
1.让进程运行在新的session(会话)里即不属于此终端的子进程。
2.可以实现让进程忽略HUP信号
解决方法:
1.nohup命令
功能:不挂断地运行命令,忽略HUP信号。
语法:nohup command &
实例:

  1. [root@DigMouse ~]# nohup ping 51osos.com > /dev/null &
  2. [1] 13683
  3. [root@DigMouse ~]# nohup: ignoring input and redirecting stderr to stdout
  4. [root@DigMouse ~]# ls
  5. Desktop    Downloads  nohup.out
  6. Documents  Music      Public    Videos
  7. [root@DigMouse ~]# cat nohup.out
  8. PING cd447.gotoip.net (122.225.57.246) 56(84) bytes of data.
  9. 64 bytes from 122.225.57.246: icmp_seq=1 ttl=56 time=48.6 ms
  10. 64 bytes from 122.225.57.246: icmp_seq=2 ttl=56 time=47.8 ms
  11. 64 bytes from 122.225.57.246: icmp_seq=3 ttl=56 time=49.9 ms
  12. 64 bytes from 122.225.57.246: icmp_seq=4 ttl=56 time=49.5 ms

复制代码

  1. [root@DigMouse ~]# ps -ef | grep ping
  2. root     13683 13655  0 09:33 pts/0    00:00:00 ping 51osos.com
  3. root     13687 13655  0 09:36 pts/0    00:00:00 grep ping
  4. [root@DigMouse ~]#

复制代码

关闭此终端,打开另一个终端使用ps命令,仍然可以查看到ping进程。 无论是否将 nohup 命令的输出重定向到终端,输出都将附加到当前目录的 nohup.out 文件中。如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out 文件中。
#nohup command > command.out 2>&1 &
上面的例子中nohup command输出的内容输出到了command.out文件中,错误内容输出到了标准输出。

2.setsid命令
功能:run a program in a new session在新的会话中运行程序
实例:

  1. [root@DigMouse ~]# setsid ping 51osos.com > /dev/null
  2. [root@DigMouse ~]# ps -ef | grep ping
  3. root     13696     1  0 09:45 ?        00:00:00 ping 51osos.com
  4. root     13698 13655  0 09:46 pts/0    00:00:00 grep ping
  5. [root@DigMouse ~]#

复制代码

从上例可以看出ping进程的PID是13696,进程的父ID(PPID)是init而不是当前终端的进程 ID,可与nohup比较。

3.将"&"也放入“()”内执行命令
将一个或多个命名包含在“()”中就能让这些命令在子 shell 中运行

  1. [root@DigMouse ~]# (ping 51osos.com > /dev/null &)
  2. [root@DigMouse ~]# ps -ef | grep ping
  3. root     13702     1  0 09:50 pts/0    00:00:00 ping 51osos.com
  4. root     13704 13655  0 09:50 pts/0    00:00:00 grep ping
  5. [root@DigMouse ~]#

复制代码

进程的父ID(PPID)是init而不是当前终端的进程 ID,因而关闭终端无任何影响。
4.disown命令

    • 用disown -h jobspec 来使某个作业忽略HUP信号。
    • 用disown -ah 来使所有的作业都忽略HUP信号。
    • 用disown -rh 来使正在运行的作业忽略HUP信号。
    • 当使用过 disown 之后,会将把目标作业从作业列表中移除,我们将不能再使用jobs来查看它,但是依然能够用ps -ef查找到它。

      但是还有一个问题,这种方法的操作对象是作业,如果我们在运行命令时在结尾加了"&"来使它成为一个作业并在后台运行,那么就万事大吉了,我们可以通过jobs命令来得到所有作业的列表。但是如果并没有把当前命令作为作业来运行,如何才能得到它的作业号呢?答案就是用 CTRL-z(按住Ctrl键的同时按住z键)了!

      CTRL-z 的用途就是将当前进程挂起(Suspend),然后我们就可以用jobs命令来查询它的作业号,再用bg jobspec 来将它放入后台并继续运行。需要注意的是,如果挂起会影响当前进程的运行结果,请慎用此方法。

      1. [root@DigMouse ~]# ping 51osos.com > /dev/null
      2. ^Z
      3. [1]+  Stopped                 ping 51osos.com > /dev/null
      4. [root@DigMouse ~]# jobs
      5. [1]+  Stopped                 ping 51osos.com > /dev/null
      6. [root@DigMouse ~]# bg %1
      7. [1]+ ping 51osos.com > /dev/null &
      8. [root@DigMouse ~]# jobs
      9. [1]+  Running                 ping 51osos.com > /dev/null &
      10. [root@DigMouse ~]# disown -h %1

      复制代码

      1. [root@DigMouse ~]# ps -ef | grep ping
      2. root     13716 13655  0 09:59 pts/0    00:00:00 ping 51osos.com
      3. root     13734 13655  0 10:01 pts/0    00:00:00 grep ping

      复制代码

      此时jobs还是能看到ping后台任务的。logout后在另一个终端测试

      1. [root@DigMouse ~]# ps -ef | grep ping
      2. root     13716     1  0 09:59 ?        00:00:00 ping 51osos.com
      3. root     13754 13738  0 10:02 pts/1    00:00:00 grep ping

      复制代码

      此时Jobs无ping后台任务。PPID变成了1

      5.screen命令

      此命令非常强大。如果非常多的命令都需要忽略HUP命令,screen可以解决这一问题。screen 提供了 ANSI/VT100 的终端模拟器,使它能够在一个真实终端下运行多个全屏的伪终端。

      • 用screen -dmS session name 来建立一个处于断开模式下的会话(并指定其会话名)。
      • 用screen -list 来列出所有会话。
      • 用screen -r session name 来重新连接指定会话。
      • 用快捷键CTRL-a d 来暂时断开当前会话。
      • 我的CentOS6.0上没有screen命令,不过可以使用yum安装。
        1. [root@DigMouse ~]# yum list screen
        2. Available Packages
        3. screen.i686                         4.0.3-15.el6                         base
        4. [root@DigMouse ~]# yum install screen*

        复制代码

        Ok,系统有了screen命令了。

        1. [root@DigMouse ~]# screen -r DigMouse
        2. [root@DigMouse ~]# ping 51osos.com > /dev/null &
        3. [1] 13789
        4. [root@DigMouse ~]# pstree -H 13789

        复制代码

        此时 bash 是 screen 的子进程,而 screen 是 init(PID为1)的子进程。那么当 ssh 断开连接时,HUP 信号自然不会影响到 screen 下面的子进程了。

断开ssh链接在后台继续运行命令的更多相关文章

  1. linux 后台执行nohup 命令,终端断开无影响

    nohup /root/start.sh & 在shell中回车后提示: [~]$ appending output to nohup.out原程序的的标准输出被自动改向到当前目录下的nohu ...

  2. 想要远程服务器长时间挂机不断开ssh连接的技巧

    使用top命令挂着就好了,top命令执行的“查看系统进程和资源占用”的任务会一直输出动态的数据,一直有数据传输就不会因为长时间挂机而断开ssh链接了,尤其针对于海外服务器,因为高延迟经常出现挂机久了自 ...

  3. 避免ssh断开导致运行命令的终止:screen

    事情是这样的,需要使用ssh登陆服务器,进行工程的编译,结果不知道什么原因ssh出现write failed:broken pipe,掉线了.反复实验了好几次还是这样(白花花的时间啊,又是config ...

  4. Linux 后台运行命令:nohup 和 &

    [参开文章]:nohup 与 & 的区别 1. nohup 1.1 基本概念 将程序以忽略挂起信号的方式运行起来: 不可以免疫 Ctrl + C  的 SIGINT 中断信号: 可以免疫 SI ...

  5. linux 命令行远程登录 后台运行命令的方法

    linux 命令行远程登录 后台运行命令的方法 http://blog.csdn.net/isuker/article/details/55061595 Linux 技巧:让进程在后台可靠运行的几种方 ...

  6. Linux后台运行命令 nohup command > myout.file 2>&1

    Linux命令后台运行 转自北国的雨,谢谢:http://www.cnblogs.com/lwm-1988/archive/2011/08/20/2147299.html 有两种方式:1. comma ...

  7. nohup 后台运行命令

    在Linux上部署zipkin,在SSH客户端执行java -jar zipkin-server-1.21.0-exec.jar,启动成功,在关闭SSH客户端后,运行的程序也同时终止了,怎样才能保证在 ...

  8. redmine后台运行命令

    nohup ruby script/rails server webrick -e production & redmine 3 后台运行命令: nohup  bundle exec rail ...

  9. nobup 与 后台运行命令

    1. Linux进程状态:R (TASK_RUNNING),可执行状态&运行状态(在run_queue队列里的状态) 2. Linux进程状态:S (TASK_INTERRUPTIBLE),可 ...

随机推荐

  1. 对flex深入研究一点

    flex顶层设计 1.在任何流动的方向上(包括上下左右)都能进行良好的布局 2.可以以逆序 或者 以任意顺序排列布局 3.可以线性的沿着主轴一字排开 或者 沿着侧轴换行排列 4.可以弹性的在任意的容器 ...

  2. GO语言学习笔记5-defer的使用

    1. 什么是defer defer是Go语言提供的一种用于注册延迟调用的机制:让函数或语句可以在当前函数执行完毕后(包括通过return正常结束或者panic导致的异常结束)执行. 2. defer的 ...

  3. asp.net 如何实现大文件断点上传功能?

    之前仿造uploadify写了一个HTML5版的文件上传插件,没看过的朋友可以点此先看一下~得到了不少朋友的好评,我自己也用在了项目中,不论是用户头像上传,还是各种媒体文件的上传,以及各种个性的业务需 ...

  4. ubuntu下,VSCode采用cmake编译C++工程

    首先在VSCode中下载CMake和CMake Tools两个插件. 选中CMake Tools,可以看到在VSCode中如何使用cmake编译C++工程的教程. 官网教程 最重要且最实用,看这个网址 ...

  5. 【转载】自动化运维系列之Cobbler给Openstack节点安装操作系统

    preface 我们在一篇博文知道了如何搭建Cobbler,那么下面就通过Cobbler来安抓Openstack所有节点吧. 服务器配置信息如下: 主机名 IP 角色 Cobbler.node.com ...

  6. Oracle数据库链接超级慢或者总提示链接超时

    Centos6  今天tomcat应用程序链接数据库总提示链接超时,客户端工具通过tnsnames连接数据库实例进行操作也超级慢, 实在无法忍受, 重启实例试试吧,重启了还是不好使,还是很慢很慢,无比 ...

  7. ArrayList类源码浅析(一)

    1.首先来看一下ArrayList类中的字段 可以看出,ArrayList维护了一个Object数组,默认容量是10,size记录数组的长度: 2.ArrayList提供了三个构造器:ArrayLis ...

  8. Vue.js之Ajax请求

    Vue.js同React.Angular,可以说号称前端三巨头. 前段时间,有个哥们说,Vue.js现在出2.0版本了.可是我现在还是在用1.0的. Vue.js一直都没有好好系统的学习,包括目前公司 ...

  9. 如何用CSS3画出懂你的3D魔方?

    作者:首席填坑官∙苏南公众号:honeyBadger8,群:912594095,本文原创,著作权归作者所有,转载请注明原链接及出处. 前言 最近在写<每周动画点点系列>文章,上一期分享了& ...

  10. sql 查询每天数据

    一 表 内数据存的是 ‘2017-09-08 15:13:59’这样格式 表 customer_mate_follow 时间字段 created_at   1, SELECT ,) as day, C ...