如何使jar文件在启动时及退出时运行?


30

我不知道从哪里开始寻找。我一直在阅读有关守护程序的内容,但并不了解该概念。

更多细节 :

  • 我一直在写一个搜寻器,它永远不会停止,并且不会通过Internet上的RSS搜寻。
  • 搜寻器已经用Java编写-因此现在是一个jar。
  • 我是拥有Ubuntu 11.04的计算机上的管理员。
  • 机器有可能崩溃,所以我希望每次启动机器时都运行搜寻器。
  • 此外,即使我注销,我也希望它能够继续运行。我不确定这是否可行,但是大多数情况下我都注销了,但我仍然希望它能够爬网。

有任何想法吗?有人可以指出我正确的方向吗?

只是寻找最简单的解决方案。

Answers:


32

这是使用SysVInit的一种简单方法。说明:

  1. 创建您的应用程序的开始和停止脚本。将其放在某个目录中,在我们的示例中是:

    • 启动脚本: /usr/local/bin/myapp-start.sh
    • 停止脚本: /usr/local/bin/myapp-stop.sh

    每个人都将提供运行/停止该应用程序的说明。例如,myapp-start.sh内容可以像下面这样简单:

    #!/bin/bash
    
    java -jar myapp.jar 
    

    对于停止脚本,可能是这样的:

    #!/bin/bash
    # Grabs and kill a process from the pidlist that has the word myapp
    
    pid=`ps aux | grep myapp | awk '{print $2}'`
    kill -9 $pid
    
  2. 创建以下脚本(myscript)并将其放上/etc/init.d

    /etc/init.d/myscript 内容:

    #!/bin/bash
    # MyApp
    #
    # description: bla bla
    
    case $1 in
        start)
            /bin/bash /usr/local/bin/myapp-start.sh
        ;;
        stop)
            /bin/bash /usr/local/bin/myapp-stop.sh
        ;;
        restart)
            /bin/bash /usr/local/bin/myapp-stop.sh
            /bin/bash /usr/local/bin/myapp-start.sh
        ;;
    esac
    exit 0
    
  3. 将脚本放入系统中(使用SysV)。只需运行以下命令(以root身份):

    update-rc.d myscript defaults 

PS:我知道Upstart非常好,但我还是喜欢旧的SysV初始化系统。


1
但是系统如何知道将使用什么参数?如何设置为“开始”。在这里尝试过,它没有用。
John John Pichler

1
此方法有效,但是命令“ service myapp start”不会退出该命令。
Tobia 2015年

现在如何在myscript中使用start | stop | restart选项?
Codevalley

此外,即使执行了3个步骤,我的jar也无法在启动时运行。您确定我们是否必须更改权限,路径或类似内容?
Codevalley

正如我提到的,@ Codevalley,此方法用于SysV初始化。要使用服务或其他命令,您需要编写新贵的作业。但是,如果要执行此操作,则应编写一个systemd(因为它已成为标准)
Marcos Roriz Junior

6

是! 有可能的。:) Upstart是确保服务保持运行的一种方式。它有五个软件包,默认情况下全部安装:

  • 新贵的init守护程序和initctl实用程序
  • upstart-logd为logd服务提供logd守护程序和作业定义文件
  • upstart-compat-sysv为rc任务以及重新启动,运行级别,关闭和telinit工具提供作业定义文件,这些文件提供与SysVinit的兼容性
  • 启动任务为系统启动任务提供作业定义文件
  • 系统服务为tty服务提供作业定义文件

学习非常愉快,非常值得。新贵有一个网站:http : //upstart.ubuntu.com/


从Upstart网站开始,截至2019年:“项目仅处于维护模式。没有开发任何新功能,一般建议是移至另一个最小初始化系统或systemd”
Nav

2

3个快速建议...

  1. 在(多用户控制台模式)下创建一个S tart 脚本,并在其中插入/etc/rc3.d相应的K ill脚本,/etc/rc.0/etc/rc6.d在系统断电(runevel 0)或重新引导(runlevel 6)时以受控方式杀死Java程序。请参阅Runlevels简介

    您也许可以在运行级别2(rc2.d)中启动Java应用程序,但是作为爬网程序,它将需要TCP / IP。因此,请确保事先在运行级别2中启用/启动了网络服务。在运行级别3中肯定已建立网络。

    /etc/init.d包含所有实际的开始/杀死脚本。/etc/rcN.d目录仅包含指向它们的链接,每个运行级别N都以S或K为前缀来分别启动或杀死它们。

  2. crond退出之间运行的进程应保持不变。也许将其添加到您的crontab中。

  3. 运行的过程nohup也应该持续。请参阅nohup:即使注销后也要运行命令

    $ nohup java -jar myapp.jar &

    默认情况下,myapp.jar的标准输出将转到名为的文件./nohup.out,或者$HOME/nohup.out如果前者不可写。


当我注销时,它仍会在后台运行吗?
RanZilber 2012年

0

在进行以下应用时也要注意:

  update-rc.d myscript defaults 

拥有权限0755并在.sh之前使用或获取路径。假设您的脚本位于/root/test.sh上,则应先/root/访问CD,然后再访问test.sh

因此,最好的方法是在init.d上创建SH,然后在其中更改您的路径sh并在start函数中执行它。



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.