解决Linux关闭SSH,终端后运行程序终止问题(包括后台)

问题描述:

  每次SSH到服务器上,然后运行了一个自己写的服务端程序,比如 ./myserver.sh ,然后关闭ssh或者终端之后,发现服务不能访问。

简要分析下:

  根据   这篇博文  的提示,ssh登录后会新建一个会话,一个登陆shell发起的会话,一般由一个会话首进程、一个前台进程组、一个后台进程组组成。通常来说,会话首进程是一个登录shell,比如bash。进程组是一个或多个进程的集合,进程组属于一个会话。一般来说,一个进程组中的其它进程的父进程是进程组组长进程的ID,如果,这个进程组组长终止掉之后,这个进程组中其它进程会变成孤儿进程,这个进程组也就成了孤儿进程组。对于后台进程组来说,后台进程组中的进程可以向终端设备写,但是当一个后台进程组中的进程尝试读终端设备的时候,会收到一个SIGTTIN信号,然后停止。当一个进程组成为孤儿进程组的时候,Bash无法知晓其PID,那么就无法将其放入前台,当其试图读终端设备的时候,read()调用将失败,并将errno置为EIO。

总结下就是,ssh登录后,bash都是其子进程,一旦会话终止,该会话期的所有相关的进程都会被杀死。包括后台进程。&是没有用的。

解决方案:

那么怎么解决这个问题呢?使用nohup命令。nohup命令会忽略SIGTTIN信号,从而可以在会话结束之后还可以继续运行。

比如上面的例子中,就可以使用:

nohup ./myserver.sh &

后面的&可以加也可以不用加,区别就是是否是后台。和挂断没有关系。

具体的使用方法在 http://zjking.blog.51cto.com/976858/1117828 这篇博客中有提到。

如果要在下次会话的时候还想恢复到上次会话终止前的状态,比如说我用nmap扫描某个IP段,下次登录进来要看到扫描结果。

我们可以使用screen命令。

1.使用screen进入到子界面中,然后nmap -A xxxxxxx

2.按 ctrl + a ,d 暂停子界面。这时会显示[detached],并且回到父界面。
3.想干啥干啥去。

4.查看子界面状态 screen -ls 

There is a screen on: 447.pts-1.free (Detached)

这里的447就是子界面的进程号。

5.回到子界面 screen -r 子界面pid 比如:screen -r 447

6.在子界面杀死子界面的办法是先ctrl + a ,然后按k。

具体的使用办法可以 screen -h
时间: 2024-11-02 15:27:09

解决Linux关闭SSH,终端后运行程序终止问题(包括后台)的相关文章

Linux关闭终端(或者关闭SSH等)后运行的程序自动停止

问题描述: 之前在服务器上起一个python的服务,放到后台运行. python pyserver.py &.  当我关闭这个SSH之后,该服务不可用,再次登入到服务器,已经没有这个python进程啦. 问题定位: 通过上面问题的表象,可以发现是跟SSH关闭有关.为什么ssh关闭,会导致正在运行的程序死掉.通过查看相关的资料,发现真正的元凶是SIGHUP信号导致的. 在linux中,有下面几个概念: 进程组: 一个或多个进程的集合,每一个进程组都有唯一一个进程组ID,即进程组会话器: 一个或多个

【Linux】ssh下调整运行程序前后台切换

原文:https://my.oschina.net/huxuanhui/blog/13844 我们都知道,在 Windows 上面,我们要么让一个程序作为服务在后台一直运行,要么停止这个服务.而不能让程序在前台后台之间切换.而 Linux 提供了 fg 和 bg 命令,让我们轻松调度正在运行的任务. 假设你发现前台运行的一个程序需要很长的时间,但是需要干其他的事情,你就可以用 Ctrl-Z ,挂起这个程序,然后可以看到系统提示(方括号中的是作业号): [1]+ Stopped /root/bin

解决Linux下ssh登录后出现 报错 Write failed: Broken pipe 的方法

解决也很简单,在执行 ssh 命令的时候,多加一个参数即可,如下: ssh -p 2200 -o ServerAliveInterval=60 [email protected] #服务器 8.8.8.8 的远程端口号为2200,增加标红的参数 原文地址:https://www.cnblogs.com/x00479/p/11327195.html

解决linux/Ubuntu下Qt creater 界面程序在编译运行后无法显示中文或中文乱码问题!

本文解决的主要是界面程序编译运行后无法显示中文的问题,如果在creater 中无法输入中文,下载个IBus或者搜狗之类的中文输入法即可解决! 首先说乱码问题,这个很好解决: 如果是在linux下打开Windows下的项目出现乱码,选择编码为"GB2312"即可! 现在主要来说说程序运行后无法显示中文或者出现乱码的情况,被这个问题困扰了很久,网上看了很多资料贴子都没有解决,所有该添加的都添加了都没办法, http://bbs.csdn.net/topics/390610841?page=

linux关闭ssh连接

 linux 关闭SSH 连接用户 1.查明登陆端口: # who root pts/1 Apr 8 00:06 (172.29.0.29) root pts/2 Apr 8 04:15 (172.29.0.21) 2.通知该用户将要关闭他: # echo "I will close your connection" > /dev/pts/2 这样他的终端将显示该信息. 3.关闭用户连接 # fuser -k /dev/pts/2

如何在Windows下使用Linux系统来编译和运行程序?

很多开发人员都有这样的疑问:自己平时是在Windows下面办公的,而自己编写的程序的运行环境又是Linux的,如何从Windows切换到Linux呢?是不是要专门到Linux机器上去编写代码呢? 实际上,只要在Windows下安装一个叫做SecureCRT的软件和一个叫做FileZilla的软件,便可轻松解决问题. SecureCRT和FileZilla简介 SecureCRT是一款支持SSH(SSH1和SSH2)的终端仿真程序,简单地说是Windows下登录Linux服务器主机的软件. Fil

screen实现关闭ssh之后继续运行代码

本文基于Ubuntu 14.04 使用SSH连接远程服务器,启动服务,退出SSH后,服务也就终止了,使用Screen可以解决这个问题. 1.安装Screen apt-get install screen 2.安装完成后,输入screen命令,根据提示按空格进入新的界面 3.像之前启动Meteor项目一样,进入目录,启动Meteor项目 cd /home/meteor/hello meteor 4.启动完成后访问项目 http://ip:3000,成功.关闭ssh窗口,继续访问,仍然成功. 5.再

解决Linux服务器更换IP后,ssh连接被拒绝问题

解决更换Linux服务器IP后,ssh登录报“ssh: connect to host xxx port 22: Connection refused”错误 由于之前服务器的sshd服务一直正常,但更换IP后通过putty进行登录,报“连接被拒绝”异常 一.重启sshd服务,查看登录是否正常,如果还有异常进行下面步骤 netstat sshd 二.将.ssh/known_hosts文件里面的IP地址修改正确 1.vi ~/.ssh/known_hosts 2.将老IP地址全部替换在新的IP地址

解决linux中ssh登录Warning:Permanently added (RSA) to the list of known hosts

远程登录==> [[email protected] .ssh]# ssh 192.168.9.10Warning: Permanently added '192.168.9.10' (RSA) to the list of known hosts.Last login: Fri Sep 25 15:37:49 2015 from 192.168.9.11 报Warning:Permanently added (RSA) to the list of known hosts错误 因:在执行ssh