`

让java程序在后台一直执行(例如putty关闭后后台程序继续运行)

 
阅读更多

在linux系统下如何使一个程序在后台一直执行呢?很多人使用&结尾的命令形式,但是如果没有守护进程的话,即使这样,在终端关闭时程序也会终止运行。这时候就得使用nohup命令了。

 

     例如,如果在终端中执行java -jar xxx.jar&命令,当终端关闭时,xxx.jar也会同时结束运行,但是如果执行nohup java -jar xxx.jar&命令,则程序会在后台一直运行,值得注意的是,此时程序控制台输出会被转移到nohup.out文件中。

 

附:nohup命令参考 nohup 命令   

 

用途:不挂断地运行命令。   

语法:nohup Command [ Arg ... ] [ & ]   

描述:nohup 命令运行由 Command 参数和任何相关的 Arg 参数指定的命令,忽略所有挂断(SIGHUP)信号。在注销后使用 nohup 命令运行后台中的程序。要运行后台中的 nohup 命令,添加 & ( 表示"and"的符号)到命令的尾部。   

     无论是否将 nohup 命令的输出重定向到终端,输出都将附加到当前目录的 nohup.out 文件中。如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out 文件中。如果没有文件能创建或打开以用于追加,那么 Command 参数指定的命令不可调用。如果标准错误是一个终端,那么把指定的命令写给标准错误的所有输出作为标准输出重定向到相同的文件描述符。

 


如需要了解窗口关闭导致运行进程关闭的原因:请参看下面的具体分析

 

--------------------------------------------------------------------------------
你是不是经常需要远程登录到Linux服务器?你是不是经常为一些长时间运行的任务头疼?还在用 nohup 吗?那么来看看 screen 吧,它会给你一个惊喜! 你是不是经常需要 SSH 或者 telent 远程登录到 Linux 服务器?你是不是经常为一些长时间运行的任务而头疼,比如系统备份、ftp 传输等等。通常情况下我们都是为每一个这样的任务开一个远程终端窗口,因为他们执行的时间太长了。必须等待它执行完毕,在此期间可不能关掉窗口或者断开连接,否则这个任务就会被杀掉,一切半途而废了。


【原因所在】

元凶:SIGHUP 信号
让我们来看看为什么关掉窗口/断开连接会使得正在运行的程序死掉。
在Linux/Unix中,有这样几个概念:


?进程组(process group):一个或多个进程的集合,每一个进程组有唯一一个进程组ID,即进程组长进程的ID。
?会话期(session):一个或多个进程组的集合,有唯一一个会话期首进程(session leader)。会话期ID为首进程的ID。
?会话期可以有一个单独的控制终端(controlling terminal)。与控制终端连接的会话期首进程叫做控制进程(controlling process)。当前与终端交互的进程称为前台进程组。其余进程组称为后台进程组。
根据POSIX.1定义:
挂断信号(SIGHUP)默认的动作是终止程序。
当终端接口检测到网络连接断开,将挂断信号发送给控制进程(会话期首进程)。
如果会话期首进程终止,则该信号发送到该会话期前台进程组。

 

一个进程退出导致一个孤儿进程组中产生时,如果任意一个孤儿进程组进程处于STOP状态,发送SIGHUP和SIGCONT信号到该进程组中所有进程。
因此当网络断开或终端窗口关闭后,控制进程收到SIGHUP信号退出,会导致该会话期内其他进程退出。
我们来看一个例子。打开两个SSH终端窗口,在其中一个运行top命令。
在另一个终端窗口,找到top的进程ID为5180,其父进程ID为5128,即登录shell。
使用pstree命令可以更清楚地看到这个关系:
使用ps-xj命令可以看到,登录shell(PID 5128)和top在同一个会话期,shell为会话期首进程,所在进程组PGID为5128,top所在进程组PGID为5180,为前台进程组。
关闭第一个SSH窗口,在另一个窗口中可以看到top也被杀掉了。

(其实,对于windows控制台程序,也是类似的。在一个控制台窗口中运行一个非service程序,那么控制台窗口自然是该窗口中运行程序的父进程,当父进程关闭时,默认由其创建的子进程会被kill掉。当然,应该也有机制创建类似unix的后台进程。。。)

 


【基础回避方法】
    如果我们可以忽略SIGHUP信号,关掉窗口应该就不会影响程序的运行了。nohup命令可以达到这个目的,如果程序的标准输出/标准错误是终端,nohup默认将其重定向到nohup.out文件。值得注意的是nohup命令只是使得程序忽略SIGHUP信号,还需要使用标记 & 把它放在后台运行。

 

【高级回避方法】

    虽然nohup很容易使用,但还是比较"简陋"的,对于简单的命令能够应付过来,对于复杂的需要人机交互的任务就麻烦了。
其实我们可以使用一个更为强大的实用程序screen。流行的Linux发行版(例如Red Hat Enterprise Linux 4)通常会自带screen实用程序,如果没有的话,可以从GNU screen的官方网站下载。


开始使用Screen
简单来说,Screen是一个可以在多个进程之间多路复用一个物理终端的窗口管理器。Screen中有会话的概念,用户可以在一个screen会话中创建多个screen窗口,在每一个screen窗口中就像操作一个真实的telnet/SSH连接窗口那样。在screen中创建一个新的窗口有这样几种方式:
1.直接在命令行键入screen命令
Screen将创建一个执行shell的全屏窗口。你可以执行任意shell程序,就像在ssh窗口中那样。在该窗口中键入exit退出该窗口,如果这是该screen会话的唯一窗口,该screen会话退出,否则screen自动切换到前一个窗口。
2.Screen命令后跟你要执行的程序。
Screen创建一个执行vi test.c的单窗口会话,退出vi将退出该窗口/会话。
3.以上两种方式都创建新的screen会话。我们还可以在一个已有screen会话中创建新的窗口。在当前screen窗口中键入C-a c,即Ctrl键+a键,之后再按下c键,screen 在该会话内生成一个新的窗口并切换到该窗口。
screen还有更高级的功能。你可以不中断screen窗口中程序的运行而暂时断开(detach)screen会话,并在随后时间重新连接(attach)该会话,重新控制各窗口中运行的程序。例如,我们打开一个screen窗口编辑/tmp/abc文件:
之后我们想暂时退出做点别的事情,比如出去散散步,那么在screen窗口键入C-a d,Screen会给出detached提示:

半个小时之后回来了,找到该screen会话:
重新连接会话:
看看出现什么了,太棒了,一切都在。继续干吧。
你可能注意到给screen发送命令使用了特殊的键组合C-a。这是因为我们在键盘上键入的信息是直接发送给当前screen窗口,必须用其他方式向screen窗口管理器发出命令,默认情况下,screen接收以C-a开始的命令。这种命令形式在screen中叫做键绑定(key binding),C-a叫做命令字符(command character)。

分享到:
评论

相关推荐

    putty运行程序

    PuTTY是一个Telnet、SSH、rlogin、纯TCP以及串行接口连接软件。较早的版本仅支持Windows平台,在最近的版本中开始支持各类Unix平台,并打算移植至Mac OS X上。除了官方版本外,有许多第三方的团体或个人将PuTTY移植...

    使程序在Linux下后台运行

     2:让程序在后台跑后,不会占据终端,我们可以用终端做别的事情。  二、怎么样使程序在后台执行  方法有很多,这里主要列举两种。假如我们有程序pso.cpp,通过编译后产生可执行文件pso,我们要使pso在linu

    putty,puttyex,putty插件

    另外如果需要在某个主机上执行一组命令,可以在下面的文本框中一行行输入,例如:reboot,然后勾选上下面的文本框表示连接时执行命令。这样程序会直接连接到主机并且执行命令然后退出。非常方便。

    Python脚本后台运行的几种方式

    现在脚本正常运行,通过ps能看到进程号,此时直接关闭ssh终端(不是用exit命令,是直接通过putty的关闭按钮执行的), 再次登录后发现进程已经退出了。 通过后台启动的方式该问题已经解决,这里总结下,也方便我以后...

    putty执行文件

    PuTTY是一个Telnet、SSH、rlogin、纯TCP以及串行接口连线软件。...◆ 绿色软件,无需安装,下载后在桌面建个快捷方式即可使用; ◆ 体积很小,仅472KB(0.62 版本); ◆ 操作简单,所有的操作都在一个控制面板中实现。

    putty扩展,puttyex1.0.3

    另外如果需要在某个主机上执行一组命令,可以在下面的文本框中一行行输入,例如:reboot,然后勾选上下面的文本框表示连接时执行命令。这样程序会直接连接到主机并且执行命令然后退出。非常方便。

    putty开发程序

    PUTTY 开发程序

    Java 调用 Linux shell 命令执行框架:sshxcute

    常见的办法是通过本地工具(例如 Putty)连接远程计算机,输入命令执行,但是当遇到需要集成这些任务到代码或者开发、测试框架中时,往往就没有很好的解决方案了。sshxcute 就是这样一个框架工具集,它基于 JSCH ...

    putty

    Putty 随着Linux在服务器端应用的普及,Linux系统管理越来越依赖于远程。在各种远 程登录工具中,Putty是 出色的工具之一。 Putty是一个免费的、Windows 32平台下的telnet、rlogin和ssh客户端,但是功能丝毫不逊色...

    执行文件putty

    Loadrunner11 安装过程中经常 出现找不到putty.gid错误,生成会需要很长时间,现在上传方便大家使用

    putty linux unix后台控制登陆

    putty linux unix后台控制登陆

    【免安装】直接运行 单一文件 putty.exe

    免安装 直接运行 单一文件 putty.exe

    putty文件执行文件

    putty.ext 用于通讯的,linux与windows间

    putty putty破解版 putty绿色版

    putty putty破解版 putty绿色版 远程连接Linux系统

    路由器刷机PUTTY软件

    路由器刷机PUTTY软件

    putty.zip 32位 & 64位 win环境下安装程序

    附件中为putty32位和64位WIN下两个安装程序,直接点击...putty是一款终端仿真程序,支持SSH(SSH1和SSH2)以及Telnet和rlogin协议,putty页面十分小巧,用于连接运行包括Windows、UNIX和VMS在内的远程系统的理想工具。

    putty源码,

    本人把官方的putty经过整理, 使用vs2008重新整理后, 新创建的项目, 把没用的.c/.h文件都舍弃, 完全是putty.exe使用的所有文件, 没有任何依赖库, 里边有vs9编译过的项目, 可直接编译无错误, 编译后使用正常 ...

    putty中文版putty中文版putty中文版

    不用多说吧!putty中文版putty中文版putty中文版putty中文版putty中文版putty中文版putty中文版putty中文版putty中文版putty中文版putty中文版putty中文版putty中文版putty中文版

    putty.exe windows系统远程执行linux脚本

    putty.exe windows系统远程执行linux脚本 1、下载putty.exe 2、将putty.exe 放在C:\Windows\System32\中 3、以上完成了putty.exe的安装 4、接下来就可以执行 5、cmd命令提示符 6、输入putty.exe -pw 密码**** -m .\...

    PuTTY免安装压缩包解压即可使用

    Putty是一个免费的Windows平台下的telnet、rlogin和ssh客户端,Putty的功能丝毫不逊色于商业的telnet类工具。PuTTY作为一款开放源代码的软件,主要由Simon Tatham维护,使用MIT licence授权。随着Linux系统在服务器...

Global site tag (gtag.js) - Google Analytics