转载: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. 【leetcode database】Human Traffic of Stadium

    X city built a new stadium, each day many people visit it and the stats are saved as these columns: ...

  2. 【crontab】误删crontab及其恢复

    中秋节快到了,首先祝自己中秋快乐. 昨天下午六点,心里正想着加完一个crontab就可以下班了.本来想执行 crontab -e的,没想到手一抖就输入了crontab ,然后就进入了下面这个样子.

  3. 【java工具类】对字节数组字符串进行Base64解码并生成图片

    import java.io.File;import java.io.FileOutputStream;import java.io.OutputStream;import org.springfra ...

  4. java文件分片上传,断点续传

    文件夹数据库处理逻辑 publicclass DbFolder { JSONObject root; public DbFolder() { this.root = new JSONObject(); ...

  5. java实现视频断点上传文件

    一.概述 所谓断点续传,其实只是指下载,也就是要从文件已经下载的地方开始继续下载.在以前版本的HTTP协议是不支持断点的,HTTP/1.1开始就支持了.一般断点下载时才用到Range和Content- ...

  6. 2019 Multi-University Training Contest 3 T7 Find the answer

    Find the answer Time Limit: 4000/4000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Tota ...

  7. The GuidRepresentation for the reader is CSharpLegacy, which requires the binary sub type to be Uuid

    使用客户端链接MongoDb报错 The GuidRepresentation for the reader is CSharpLegacy, which requires the binary su ...

  8. prometheus 监控项

    此处记录prometheus监控项,exporter为 node_exporter vim rules.yml groups: - name: node rules: - alert: server_ ...

  9. 转载:JIRA_7.13(破解)安装教程

    参考:https://blog.csdn.net/weixin_38229356/article/details/84875205 参考2:https://www.codercto.com/a/399 ...

  10. sqli-labs(22)

    接下里我们进入第二二关 好像和第21关一样 cookie的base64加密注入 闭合变成了双引号而已 0X01 构造语句进行尝试 " union select 1,2,3# IiB1bmlv ...