book_suppanda007
2010-03-22 23:13
浏览 437
已采纳

远程连接Linux运行jar程序自动停止问题?

我有一个runOcr.sh脚本,运行一个Jar程序,这个程序的任务是每隔5秒钟扫描指定目录,扫描新增图片信息,然后将获取的结果放到数据库,脚本如下:
java -jar -Xms256m -Xmx1024m OCRClient.jar &
运行环境是在SUSE 9企业版下。

我通过xmanger连接到suse上,执行sh命令。用以下几种方式。
方法一:nohup ./runOcr.sh & 会在命令所在文件夹生成一个nohup.out记录命令运行情况
方法二:setsid ./runOcr.sh &
方法三:新开一个screen来运行命令

这几种方式在断开xmanger终端连接后一样在运行。但是当我新增图片到指定目录,这个程序就一直卡在哪里,不读新增图片信息。如果我通过xmanger重新登录系统,只是登录,什么都不做,程序也不卡了,继续开始读取新增的图片信息。感觉是这个进程睡眠了,需要重新登录激活这个程序一样。

我的问题:如何解决上面的现象,远程登录后运行服务在断开,后台进程一直运行不卡呢?tomcat的startup.sh是如何做的呢?

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

5条回答 默认 最新

  • qwe_rt 2010-03-23 07:50
    已采纳

    lz看看这篇文章,里面提到了一点,是关于xmanager进程的级别问题
    [quote]检查 /etc/inittab 修改运行级别为5 (X11) ,如果为3的话,你看到的将不是桌面,而是命令行窗口。

    init 0(halt,不要将其设置为系统的initdefault)
    init 1(single user mode,单使用者模式)
    init 2(multiuser,without nfs,多用户模式,不带NFS)
    init 3(Full multiuser mode,多用户模式,带NFS)
    init 4(unused,保留)
    init 5(X11,图形界面多用户模式)
    init 6(reboot,不要将其设置为系统的initdefault)
    id:5:initdefault:[/quote]

    上面显示x11(xmanager进程名)的进程运行的级别为5。
    关于xmanager的xdmcp原理的资料太少,所以只能根据上面,所查的资料以及结合linux系统进程知识,做出下面的推断:
    1、用xmanager连接上linux,在linux系统中会产生一个进程,而这个进程将会是一个父进程,它负责创建为了运行其他“xmanager与linux交互”的命令而需要的子进程。
    2、当通过xmanager操作linux时,比如你
    [quote]执行sh命令,让你的java程序不断的检测文件系统新增的文件[/quote]
    第一步中父进程将创建子进程,这个子进程负责管理你执行的任务。
    3、现在搞清楚了,父进程与子进程之间来龙去脉。分析一下断开xmanager时,可以肯定一点:父进程原来的“运行(running)”状态肯定发生了变化。至于变成什么状态,推断是终止了,当然父进程终止,子进程也终止运行。
    4、在xmanager断开连接时,xmanager做了一件事:应该是记录被迫终止的子进程的所有状态以及内存信息。
    5、下次再连接时,将继续执行上次未完成的任务。
    讲到这里,应该够详细吧~

    点赞 打赏 评论
  • suziwen 2010-03-22 23:44

    试过SSH直接登录呢?或者TELNET呢
    效果也一样吗

    点赞 打赏 评论
  • wanghaolovezlq 2010-03-23 00:14
    点赞 打赏 评论
  • qwe_rt 2010-03-23 08:04

    补充:一开始想当xmanager断开连接时,父进程进入休眠状态。
    但是查了一下linux下进程的资料发现不可能,因为在当父进程调用wait时,进入等待状态,或者父进程调用sleep休眠了。
    下面这段代码说明了这个问题:
    [code="c"] #include
    #include
    void main() { pid_t pid; pid=fork(); if(pid<0) /* 如果出错 /
    printf("error occurred!\n");
    else if(pid==0) /
    如果是子进程 /
    exit(0); else /
    如果是父进程 /
    sleep(60); /
    休眠60秒,这段时间里,父进程什么也干不了 /
    wait(NULL); /
    收集僵尸进程 */
    } [/code]
    sleep的作用是让进程休眠指定的秒数,在这60秒内,子进程已经退出,而父进程正忙着睡觉,不可能对它进行收集,当60秒过后,父进程调用了wait(NULL),对已经处于僵死状态的子进程回收。
    更多资料参考:[url=http://blog.csdn.net/cg05568256068/archive/2009/09/13/4547636.aspx]http://blog.csdn.net/cg05568256068/archive/2009/09/13/4547636.aspx[/url]
    [url=http://os.51cto.com/art/201002/185142.htm]http://os.51cto.com/art/201002/185142.htm[/url]
    [url=http://blog.wsdd.org/?p=595]http://blog.wsdd.org/?p=595[/url]
    [url=http://www.diybl.com/course/3_program/c++/cppjs/20100122/193812.html]http://www.diybl.com/course/3_program/c++/cppjs/20100122/193812.html[/url]

    点赞 打赏 评论
  • qwe_rt 2010-03-24 17:34

    那有可能是xmanager的父进程创建多个子进程,然后由这些子进程去管理不同的任务。

    点赞 打赏 评论

相关推荐 更多相似问题