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