zoukankan      html  css  js  c++  java
  • (转)为什么ssh一关闭,程序就不再运行了?


    问题描述

    • 当SSH远程连接到服务器上,然后运行一个程序,eg: ./test.sh, 然后把终端开闭(切断SSH连接)之后,发现该程序中断.

    原因

    • 主要元凶: 挂断信号(SIGHUP) 信号

    概念介绍

    • 在Linux/Unix中,有这样几个概念:
    • 进程组(process group): 一个或多个进程的集合,每一个进程组有唯一一个进程组ID,即进程组长进程的ID.
    • 会话期(session): 一个或多个进程组的集合,有唯一一个会话期首进程(session leader). 会话期ID为首进程的ID.
    • 会话期可以有一个单独的控制终端(controlling terminal).
    • 与控制终端连接的会话期首进程叫做控制进程(controlling process).
    • 当前与终端交互的进程称为前台进程组.
    • 其余进程组称为后台进程组.
    • 根据POSIX.1定义: 挂断信号(SIGHUP)默认的动作是终止程序。

    解释

    • 当终端接口检测到网络连接断开, 将挂断信号发送给控制进程(会话期首进程).
    • 如果会话期首进程终止,则该信号发送到该会话期前台进程组.
    • 一个进程退出导致一个孤儿进程组产生时, 如果任意一个孤儿进程组进程处于STOP状态, 发送 SIGHUP 和 SIGCONT 信号到该进程组中所有进程.
    • 孤儿进程参照

    结论

    • 因此当网络断开或终端窗口关闭后, 也就是SSH断开以后, 控制进程收到 SIGHUP 信号退出, 会导致该会话期内其他进程退出.
    • 简而言之: 就是 ssh 打开以后, bash等都是他的子程序, 一旦ssh关闭, 系统将所有相关进程杀掉!! 导致一旦ssh关闭, 执行中的任务就取消了.

    相关问题

    为什么守护程序就算是 ssh 打开的, 关闭ssh也不会影响其运行?

    • 因为他们的程序特殊, 比如httpd –k start运行这个以后, 他不属于sshd这个进程组, 而是单独的进程组, 所以就算关闭了ssh, 和他也没有任何关系!

    使用后台运行命令 & 能否将程序摆脱ssh进程组控制? 即关闭 ssh, 后台程序能否继续运行?

    • 只要是ssh 打开执行的一般命令,不是守护程序,无论加不加&,一旦关闭ssh,系统就会用SIGHUP终止.

    如何解决方案

    • 在远端开启 tmux , 在 tmux 里运行程序, 此时运行的程序属于 tmux 的进程组, 不属于 ssh 进程组.
    • 使用 nohup 命令

    http://zjking.blog.51cto.com/976858/1117828

  • 相关阅读:
    maven安装以及eclipse配置maven
    jquery 图片文件转base64 显示
    Java 解析Excel文件为JSON
    Dropwizard框架入门
    使用Spring Security和OAuth2实现RESTful服务安全认证
    SQL语句大小写是否区分的问题,批量修改整个数据库所有表所有字段大小写
    13个可实现超棒数据可视化效果的Javascript框架
    C#创建数字证书并导出为pfx,并使用pfx进行非对称加解密
    C#使用RSA证书文件加密和解密示例
    C# 中使用 RSA加解密算法
  • 原文地址:https://www.cnblogs.com/schips/p/12081430.html
Copyright © 2011-2022 走看看