Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在linux上全天候执行Java程序_Java_Linux_Web Applications - Fatal编程技术网

如何在linux上全天候执行Java程序

如何在linux上全天候执行Java程序,java,linux,web-applications,Java,Linux,Web Applications,我开发了两个小型Java应用程序—一个普通Java应用程序和一个Java Web应用程序(即Spring MVC、servlet、JSP等)。 普通应用程序由多个线程组成,这些线程以不同的速率(从每秒一次到每分钟两次)从多个网站连续读取数据,处理数据并将其写入数据库。 Web应用程序从数据库读取数据,并使用JSP等进行显示。 我现在想将应用程序部署到Linux机器上,并让它们全天候运行。 如果应用程序崩溃,我希望它们重新启动。 最好的方法是什么?默认情况下,web容器将全天候运行。如果部署的应用

我开发了两个小型Java应用程序—一个普通Java应用程序和一个Java Web应用程序(即Spring MVC、servlet、JSP等)。
普通应用程序由多个线程组成,这些线程以不同的速率(从每秒一次到每分钟两次)从多个网站连续读取数据,处理数据并将其写入数据库。
Web应用程序从数据库读取数据,并使用JSP等进行显示。

我现在想将应用程序部署到Linux机器上,并让它们全天候运行。
如果应用程序崩溃,我希望它们重新启动。

最好的方法是什么?

默认情况下,web容器将全天候运行。如果部署的应用程序抛出异常,则容器将捕获该异常。我通常不会期望这个过程不运行。也许如果线程跑掉了,那么它可能会变得无响应,因此值得监视(也许是通过一个单独的进程通过HTTP查询它?)


您的香草应用程序是否需要定期运行?如果是这样,那么这是一个很好的选择。它将每隔“n”分钟调用一个新实例(或以您配置它的方式)。如果您的实例遇到问题,那么它将简单地退出,并在下一个配置的时间间隔启动一个新实例。同样,您可能应该对此进行监控(捕获日志文件?),以防某些问题确定它永远不会完全成功。

默认情况下,您的web容器将全天候运行。如果部署的应用程序抛出异常,则容器将捕获该异常。我通常不会期望这个过程不运行。也许如果线程跑掉了,那么它可能会变得无响应,因此值得监视(也许是通过一个单独的进程通过HTTP查询它?)

您的香草应用程序是否需要定期运行?如果是这样,那么这是一个很好的选择。它将每隔“n”分钟调用一个新实例(或以您配置它的方式)。如果您的实例遇到问题,那么它将简单地退出,并在下一个配置的时间间隔启动一个新实例。同样,您可能应该监视这个(捕获日志文件?),以防某些问题确定它永远不会完全成功。

我每15分钟运行一次作业,以查看脚本是否仍在运行。如果没有,它将重新启动服务。脚本本身是一段Perl代码:

#!/usr/bin/perl                                                                                      

use diagnostics;
use strict;

my %is_set;
for (@ARGV) {
  $is_set{$_} = 1;
}

my $verbose = -1;
if ($is_set{"--verbose"}) {
  $verbose = 1;
}

my @components = ("cdk", "qsar", "rdf");
foreach my $comp (@components) {
  print "Checking component $comp\n" if ($verbose == 1);
  my $bla = `ps aux | grep component | grep $comp-xws | grep -v "ps aux" | wc -l`;
  $bla =~ s/\n|\r//g;
  if ($bla eq "1") {
    print " ... running\n" if ($verbose == 1);
  } else {
    print " ... restarting component $comp\n" if ($verbose == 1);
    system "cd /home/egonw/runtime/$comp; sh runCDKcomponent.sh &";
  }
}
我每15分钟运行一次作业,以查看脚本是否仍在运行。如果没有,它将重新启动服务。脚本本身是一段Perl代码:

#!/usr/bin/perl                                                                                      

use diagnostics;
use strict;

my %is_set;
for (@ARGV) {
  $is_set{$_} = 1;
}

my $verbose = -1;
if ($is_set{"--verbose"}) {
  $verbose = 1;
}

my @components = ("cdk", "qsar", "rdf");
foreach my $comp (@components) {
  print "Checking component $comp\n" if ($verbose == 1);
  my $bla = `ps aux | grep component | grep $comp-xws | grep -v "ps aux" | wc -l`;
  $bla =~ s/\n|\r//g;
  if ($bla eq "1") {
    print " ... running\n" if ($verbose == 1);
  } else {
    print " ... restarting component $comp\n" if ($verbose == 1);
    system "cd /home/egonw/runtime/$comp; sh runCDKcomponent.sh &";
  }
}
使用Ubuntus,您可以自动恢复进程。更低级的一点是将respawn直接放在/etc/inittab中。两者都能很好地工作,但upstart更易于管理(更多的工具),但需要更新的系统(ubuntu、fedora和debian很快就会切换)

对于inittab,您需要在/etc/inittab中添加一行,如下所示:

对于upstart,您可以执行类似的操作(这是ubuntu 9.10中的标准脚本):

使用Ubuntus,您可以自动恢复进程。更低级的一点是将respawn直接放在/etc/inittab中。两者都能很好地工作,但upstart更易于管理(更多的工具),但需要更新的系统(ubuntu、fedora和debian很快就会切换)

对于inittab,您需要在/etc/inittab中添加一行,如下所示:

对于upstart,您可以执行类似的操作(这是ubuntu 9.10中的标准脚本):


查看ServletContextListener,这允许您将java应用程序嵌入到web应用程序中(通过创建后台线程)。然后,您就可以在web容器中运行所有内容

考虑调查并使用由操作系统供应商支持的web容器,以便所有用于启动和关闭它的脚本(包括在出现问题时)都由除您之外的其他人编写和维护


例如,Ubuntu有一个Tomcat作为包

查看ServletContextListener,这允许您将java应用程序嵌入web应用程序中(通过创建后台线程)。然后,您就可以在web容器中运行所有内容

考虑调查并使用由操作系统供应商支持的web容器,以便所有用于启动和关闭它的脚本(包括在出现问题时)都由除您之外的其他人编写和维护


例如,Ubuntu将Tomcat作为一个软件包

首先,当问题发生时,通常最好让人查看它以找到根本原因,因为在许多情况下,不采取任何行动重启服务将无法神奇地解决问题。处理这种情况的常用方法是使用提供某种警报(通过电子邮件、短信等)的监控解决方案,让人知道有什么地方出错,需要人工操作。例如,看看OpenNMS、Zenoss、Nagios等

其次,如果您想提供某种高可用性服务,那么运行该服务的多个实例(通常称为集群)将是一个好主意。这样做时,如果一个实例发生故障,显然服务不会完全中断。请注意,在使用集群时,如果一个节点因负载过重而停机,那么集群的其余部分很可能无法处理负载,因此集群并不是所有情况下的绝对保证。实现这一点(至少对于web应用程序)取决于您使用的应用程序服务器或servlet引擎

但事实上,如果您正在寻找简单而直接的工作,我强烈建议您检查一下,哪一个是定制cron工作的更好选择(不要重新发明轮子,monit正以一种智能的方式做您想要的事情)。有关介绍,请参见:

monit是一个用于管理和监视Unix系统上的进程、文件、目录和设备的实用程序。Monit进行自动维护和维修,并能执行有意义的因果行为i
user@host:/etc/init$ cat tty1.conf

# tty1 - getty
#
# This service maintains a getty on tty1 from the point the system is
# started until it is shut down again.
start on stopped rc RUNLEVEL=[2345]
stop on runlevel [!2345]

respawn
exec /sbin/getty -8 38400 tty1