1.问题背景

Java是跨平台的,大部分程序也都是在Linux服务器上运行的。但是很多朋友其实对服务器了解并不多,对相关知识也是一知半解。很多概念可能知道,但是并不十分清楚,仅仅是基本运用。可能很多新手朋友脱离了IDE或者web容器,都不知道怎么在服务器上运行程序。

举个简单的例子,相信很多朋友刚接触Linux的时候都遇到过这个问题。我们通过终端连接上服务器,通过命令行或者脚本运行了一个程序,然后关闭了终端连接,可能程序进程就消失了。我们也可能知道,在启动命令后面加&符号,可以进程在后台运行,关闭终端后,进程依然会消失,但如果通过shell脚本去运行,关闭终端连接后,程序可能不会消失。或者我们又知道可以通过nohup命令让进程在后台运行,并且关闭连接后,程序不会消失,到底为什么呢?

下面我会用比较通俗的语言进行讲解,如果有错误,欢迎指正。

2.进程关闭分析

当我们连接到服务器以后,运行的命令,启动的程序,设置的环境变量,都会挂在当前的连接中(非特殊设置或者特殊命令),当连接关闭时,所有东西都会消息。

进程的关闭,是通过信号进行传递的。我们通过kill命令发送不同的信号,去关闭指定的进程, 当我们关闭终端连接时,会向当前终端连接的下游进程发送SIGHUP信号(就是kill -1),触发进程关闭动作。

我们可以通过ps -fe|grep XXX查询进程信息。

[work ~]$ ps -fe|grep Test
work     31133 30981  0 20:09 pts/4    00:00:00 java Test
work     31277 23065  0 20:09 pts/1    00:00:00 grep --color Test

前三个分别对应 uid / pid(进程id) / ppid(父进程id),ppid其实就是当前终端连接的进程id。如果kill -9 ppid,当前终端连接就断了。

有时候我们执行一个命令,程序会在一直在运行,我们可以通过ctrl+c,发送的SIGINT信号(就是kill -2),中断程序。也可以通过ctrl+z,发送SIGTSTP信号,挂起进程,通过jobs命令查看,通过fg命令调起。

在linux中,通过命令行方式运行,属于交互模式。通过脚本方式运行属于非交互模式。 在非交互模式下,shell会对后台进程设置SIGINT信号忽略。

所以我们采用交互模式,也就是命令行方式运行1128.www.qixoo.qixoo.com/java xxx &,后台运行一个进程(在当前的终端连接下后台运行),关闭终端连接时,进程会关闭。而通过shell脚本的方式,执行java xxx &命令,关闭连接时,java进程会把父进程id,切换挂在到init进程下(父进程id为1),也就是真正的后台运行了。

nohup命令会忽略SIGHUP信号,因此通过nohup java xxx &的方式运行,不论采用交互模式或者非交互模式运行,在终端连接关闭时,都会挂到init进程下。

3.总结

在Linux中,通过信号,关闭进程,通过忽略信号,并把进程挂载到init进程下,保证进程可以后台运行。

Linux进程关闭和后台运行解析的更多相关文章

  1. linux进程永久放后台运行

    我们使用ssh连接服务器之后,如果在执行某个命令需要时间特别长,当把终端断掉之后,命令就自动停止了一般我们在ssh客户端执行命令之后,默认他的父进程是ssh,所以把ssh终端关掉之后,子进程也就被自动 ...

  2. Linux下java nohup 后台运行关闭后进程停止的原因,不挂断后台运行命令

    Linux下java nohup 后台运行关闭后进程停止的原因,不挂断后台运行命令 今天写sh脚本发现一终止命令程序就停止运行了,检查了很久才发现后面少了个&字符导致的!错误写法:nohup ...

  3. Linux scp 设置nohup后台运行

    Linux scp 设置nohup后台运行 1.正常执行scp命令 2.输入ctrl + z 暂停任务 3.bg将其放入后台 4.disown -h 将这个作业忽略HUP信号 5.测试会话中断,任务继 ...

  4. 【java】 linux下利用nohup后台运行jar文件包程序

    Linux 运行jar包命令如下: 方式一: java -jar XXX.jar 特点:当前ssh窗口被锁定,可按CTRL + C打断程序运行,或直接关闭窗口,程序退出 那如何让窗口不锁定? 方式二 ...

  5. linux 让程序在后台运行的几种可靠方法

    我们经常会碰到这样的问题,用 telnet/ssh 登录了远程的 Linux 服务器,运行了一些耗时较长的任务, 结果却由于网络的不稳定导致任务中途失败.如何让命令提交后不受本地关闭终端窗口/网络断开 ...

  6. 【Linux学习】nohup后台运行程序以及输出重定向

    Linux有两种命令使程序后台运行 第一种:支持后台运行,但是关闭终端的话,程序也会停止 command & 第二种:支持后台运行,关闭终端后,程序也会继续运行 nohup command & ...

  7. 用Cygwin实现在window环境下使用Linux命令-nohup 来后台运行程序

    1.安装Cygwin 下载 cygdrive-选择64或32位   http://www.cygwin.com/ 注:可以百度搜索安装步骤 2.配置它的环境变量 添加到path路径中 3.cmd  执 ...

  8. linux使脚本在后台运行

    一.为什么要使程序在后台执行 我们计算的程序都是周期很长的,通常要几个小时甚至一个星期.我们用的环境是用putty远程连接到日本Linux服务器.所以使程序在后台跑有以下三个好处: 1:我们这边是否关 ...

  9. Linux进程管理:后台启动进程和任务管理命令

    一.为什么要使程序在后台执行 我们的应用有时候要运行时间很长,如:几个小时甚至几个星期,我们可以让程序在后台一直跑. 让程序在后台运行的好处有: 终端关机不影响后台进程的运行.(不会终端一关机或者网络 ...

随机推荐

  1. rotate 3d基础

    基础 看了岑安大大的教程学习了3d基础,之前写了篇总结,觉得写的太散废话太多,重写一篇. 本文需要实现的效果如下:3d球 岑安的两篇教程写的很棒,但我感觉改变下顺序或许会更好理解. 我们把画布(此文所 ...

  2. 安装laravel5.1项目命令

    作为程序员还有什么比命令行执行效率还要快的呢,哈哈... composer create-project laravel/laravel your-project-name --prefer-dist ...

  3. ASP.NET的编译原理

    http://www.cnblogs.com/mdy2001212/archive/2008/01/31/1060345.html

  4. 基于DDD的.NET开发框架 - ABP启动配置

    返回ABP系列 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称. ASP.NET Boilerplate是一个用最佳实践和流行技术开发现代WEB应 ...

  5. Mininet的内部实现原理简介

    原文发表在我的博客主页,转载请注明出处. 前言 之前模拟仿真网络一直用的是Mininet,包括写了一些关于Mininet安装,和真实网络相连接,Mininet简历拓扑的博客,但是大多数都是局限于具体步 ...

  6. HTML5+JS 《五子飞》游戏实现(八)人机对战

    要想实现人机对战,就必须让电脑自动下棋,而且要知道自动去查找对方的棋子,看看有没有可以挑一对的,有没有可以夹一个的,这样下起来才有意思. 当电脑用户下完棋后,电脑应立即搜索用户的棋子,然后如果没有被吃 ...

  7. TRUNK的作用功能.什么是TRUNK

    TRUNK的作用功能.什么是TRUNK(转)  [复制链接]   发表于 2011-11-24 11:01 | 来自  51CTO网页 在技术领域中把TRUNK翻译为中文是“主干.干线.中继线.长途线 ...

  8. [转]mysql免安装版配置

    现在mysql有一个installer,相当于安装包管理器.包含mysql的各个组件,比如workbench,各个语言的connector.十分方便,不用就可惜了.实在没有必要下载zip版,自己配置. ...

  9. Android-动画简介

    Android中动画分为3种: ween Animation:通过对场景里的对象不断做图像变换(平移.缩放.旋转)产生动画效果,即是一种渐变动画: 也称View动画:也叫渐变动画,针对View的动画, ...

  10. Spring 配置文件中将common.properties文件外置

    将配置文件的路径从项目中移出来 1. 在springApplicationContext中 <context:property-placeholder location="file:$ ...