背景:将一个应用服务放在服务器上,提供接口给其他人调用,每次通过win10上的xshell通过ssh访问,启动后如果关闭ssh, 那么服务就停止了
一,简单bg
1. 在ssh shell中运行脚本,比如我运行一个批量下载脚本:
python mainserver.py
2. 按下ctrl-z中断脚本运行,此时系统提示:
^Z
[1]+ Stopped python3 mainServer.py
意思是编号为1的任务挂起了,[1]就是任务的编号,里面的数字也可能是2,3,4..
3. 输入命令:bg 1
这个命令将1号任务切换到后台执行
[1]+ python3 mainServer.py &
4. 输入命令:disown -h %1
这个命令的意思是将1号任务从当前shell的任务列表中移除,并且忽略HUP信号,这样,即使当前Shell结束了,这个任务也不会被结束,而是继续留在后台执行。
此时shell中情况如下,服务切换到后台执行,服务正常运行。
但是如果关闭该shell后,在浏览器访问该服务时候报错
而且当我重新启动命令启动服务器时候显示端口占用
说明以上方法仍没有解决我们的问题。
二,nohup
当用户注销(logout)或者网络断开时,终端会收到 HUP(hangup)信号从而关闭其所有子进程。因此,我们的解决办法就有两种途径:要么让进程忽略 HUP 信号,要么让进程运行在新的会话里从而成为不属于此终端的子进程。
在执行命令时在命令前面加上nohup,一般我们可在结尾加上“&”来将命令同时放入后台运行,也可用”>filename2>&1″来更改缺省的重定向文件名。
此后,关闭shell,断开了ssh,服务依旧在正常运行。
此种方式的缺点是,应用程序没有交互界面了,程序的输出将会输出的一个xxx.out文件中,而且以后无法在界面控制程序的结束。
如果不知道你的服务是否在运行,netstat -nultp 查看端口号,必须通过kill的方式关闭。
所以这种方式显得很简单粗鲁,很少使用。
到这已经可以简单解决我的问题了。
三,更强大的screen
如果要求第二天来的时候. 一开ssh, 还能查看到昨天运行的程序的状态,
然后继续工作,这时nohup是不行了, 需要使用screen来达到这个目的.
虽然nohup很容易使用,但还是比较“简陋”的,对于简单的命令能够应付过来,对于复杂的需要人机交互的任务就麻烦了
其实我们可以使用一个更为强大的实用程序screen。流行的Linux发行版通常会自带screen实用程序,
如果没有的话,可以从GNU screen的官方网站下载http://www.gnu.org/software/screen/
首先可以先查看是否安装screen,通过命令
screen -ls
若出现
The program ‘screen’ is currently not installed. To run ‘screen’ please ask your administrator to install the package ‘screen’
说明尚未安装,安装提示,通过命令:sudo apt-get install screen
安装失败。centOS估计可以,这里是Ubuntu16,不能直接安装,接下来尝试手动安装。
手动安装
点击下载后将文件解压tar -xf screen-4.6.2.tar.gz
进入文件夹 cd screen-4.6.2/运行配置程序,生成Makefile文件
~/appexe/screen-4.6.2$ ./configure
运行成功会得到如下提示:
在这里make编译报错,没找到解决办法。
执行screen , 按任意键进入子界面;