在Linux上运行Java应用程序作为服务

我已经编写了一个在标准虚拟托pipeLinux解决scheme上运行的Java服务器应用程序。 应用程序一直运行侦听套接字连接并为它们创build新的处理程序。 这是客户端 – 服务器应用程序的服务器端实现。

我启动它的方式是将它包含在启动服务器的rc.local脚本中。 但是,一旦开始,我不知道如何访问它来停止它,如果我想安装更新,所以我必须重新启动服务器,以重新启动应用程序。

在Windows PC上,对于这种types的应用程序,我可能会创build一个Windows服务,然后我可以停下来,并开始我想要的。 在Linux上有没有这样的东西,所以如果我启动这个应用程序,我可以停止它,并重新启动它,而不需要重新启动服务器。

我的应用程序被称为WebServer.exe。 它在服务器启动时启动,将其包含在我的rc.local中 ,如下所示:

java -jar /var/www/vhosts/myweb.com/phpserv/WebServer.jar & 

我在Linux上是一个小菜鸟,所以任何职位的任何例子,将不胜感激。 不过,我确实拥有SSH,并且可以通过完整的FTP访问安装任何更新以及访问Plesk面板。

我在这里写了另一个简单的包装:

 #!/bin/sh SERVICE_NAME=MyService PATH_TO_JAR=/usr/local/MyProject/MyJar.jar PID_PATH_NAME=/tmp/MyService-pid case $1 in start) echo "Starting $SERVICE_NAME ..." if [ ! -f $PID_PATH_NAME ]; then nohup java -jar $PATH_TO_JAR /tmp 2>> /dev/null >> /dev/null & echo $! > $PID_PATH_NAME echo "$SERVICE_NAME started ..." else echo "$SERVICE_NAME is already running ..." fi ;; stop) if [ -f $PID_PATH_NAME ]; then PID=$(cat $PID_PATH_NAME); echo "$SERVICE_NAME stoping ..." kill $PID; echo "$SERVICE_NAME stopped ..." rm $PID_PATH_NAME else echo "$SERVICE_NAME is not running ..." fi ;; restart) if [ -f $PID_PATH_NAME ]; then PID=$(cat $PID_PATH_NAME); echo "$SERVICE_NAME stopping ..."; kill $PID; echo "$SERVICE_NAME stopped ..."; rm $PID_PATH_NAME echo "$SERVICE_NAME starting ..." nohup java -jar $PATH_TO_JAR /tmp 2>> /dev/null >> /dev/null & echo $! > $PID_PATH_NAME echo "$SERVICE_NAME started ..." else echo "$SERVICE_NAME is not running ..." fi ;; esac 

你可以在这里按照完整的教程。

如果您需要输出日志,请replace2

 nohup java -jar $PATH_TO_JAR /tmp 2>> /dev/null >> /dev/null & 

 nohup java -jar $PATH_TO_JAR >> myService.out 2>&1& 

一个简单的解决scheme是创build一个通过nohup运行Java的脚本start.sh,然后将PID存储到一个文件中:

 nohup java -jar myapplication.jar > log.txt 2> errors.txt < /dev/null & PID=$! echo $PID > pid.txt 

然后停止脚本stop.sh将从文件中读取PID并杀死应用程序:

 PID=$(cat pid.txt) kill $PID 

当然,我省略了一些细节,比如检查过程是否存在,如果你完成了,删除pid.txt

Linux服务初始化脚本存储在/etc/init.d 。 您可以复制和定制/etc/init.d/skeleton文件,然后调用

 service [yourservice] start|stop|restart 

http://www.ralfebert.de/blog/java/debian_daemon/ 。 它的Debian(所以,Ubuntu也是如此),但适合更多的分布。

也许不是最好的dev-ops解决scheme,但是对于lan party或类似的服务器的普遍使用来说是很好的。

使用screen运行你的服务器,然后在注销之前分离,这将保持进程运行,你可以随时重新连接。

工作stream程:

开始一个屏幕: screen

启动你的服务器: java -jar minecraft-server.jar

按下: Ctl-ad

重新连接: screen -r

更多信息在这里: https : //www.gnu.org/software/screen/manual/screen.html

另一个也颇受欢迎的select是Java服务包装器 。 这在OSS社区也很受欢迎。

我也提到Spring Boot应用程序即服务 ,因为它是最简单,最不详细,并且最好地集成到现代发行版(甚至不像现在的CentOS 7.x)的系统版本。

从Spring Boot应用程序即服务 ,我可以推荐基于Python的supervisord应用程序。 看到堆栈溢出问题的更多信息。 这是非常简单的设置。

下面是一个示例shell脚本(请确保您将MATH名称replace为您的应用程序的名称):

 #!/bin/bash ### BEGIN INIT INFO # Provides: MATH # Required-Start: $java # Required-Stop: $java # Short-Description: Start and stop MATH service. # Description: - # Date-Creation: - # Date-Last-Modification: - # Author: - ### END INIT INFO # Variables PGREP=/usr/bin/pgrep JAVA=/usr/bin/java ZERO=0 # Start the MATH start() { echo "Starting MATH..." #Verify if the service is running $PGREP -f MATH > /dev/null VERIFIER=$? if [ $ZERO = $VERIFIER ] then echo "The service is already running" else #Run the jar file MATH service $JAVA -jar /opt/MATH/MATH.jar > /dev/null 2>&1 & #sleep time before the service verification sleep 10 #Verify if the service is running $PGREP -f MATH > /dev/null VERIFIER=$? if [ $ZERO = $VERIFIER ] then echo "Service was successfully started" else echo "Failed to start service" fi fi echo } # Stop the MATH stop() { echo "Stopping MATH..." #Verify if the service is running $PGREP -f MATH > /dev/null VERIFIER=$? if [ $ZERO = $VERIFIER ] then #Kill the pid of java with the service name kill -9 $($PGREP -f MATH) #Sleep time before the service verification sleep 10 #Verify if the service is running $PGREP -f MATH > /dev/null VERIFIER=$? if [ $ZERO = $VERIFIER ] then echo "Failed to stop service" else echo "Service was successfully stopped" fi else echo "The service is already stopped" fi echo } # Verify the status of MATH status() { echo "Checking status of MATH..." #Verify if the service is running $PGREP -f MATH > /dev/null VERIFIER=$? if [ $ZERO = $VERIFIER ] then echo "Service is running" else echo "Service is stopped" fi echo } # Main logic case "$1" in start) start ;; stop) stop ;; status) status ;; restart|reload) stop start ;; *) echo $"Usage: $0 {start|stop|status|restart|reload}" exit 1 esac exit 0 

您可以使用Thrift服务器或JMX与您的Java服务进行通信。

但一旦开始,我不知道如何访问它来阻止它

您可以编写一个简单的停止脚本来解决您的java进程,提取PID并调用kill。 这不是幻想,但它很简单。 像这样的东西可能是有帮助的一开始:

 #!/bin/bash PID = ps ax | grep "name of your app" | cut -d ' ' -f 1 kill $PID 

其他答案做得很好,根据你的平台给定制脚本和设置。 除了这些之外,这里还有我所了解的成熟的特殊用途课程:

  • 来自TanukiSoftware的JSW
  • YAJSW是上面的一个开源的克隆。 它是用Java编写的,它是一个保姆程序,根据configurationpipe理subprocess(你的代码)。 适用于Windows / Linux。
  • JSVC是一个本地应用程序。 它也是一个保姆程序,但它通过JNI调用你的子应用程序,而不是作为一个subprocess。

要将Java代码作为守护进程(服务)运行,您可以编写基于JNI的存根。

http://jnicookbook.owsiak.org/recipe-no-022/

为基于JNI的示例代码。 在这种情况下,您将启动为Java的代码进行守护程序,并在C中执行主循环。但是,也可以将Java,守护进程的服务循环放入Java中。

https://github.com/mkowsiak/jnicookbook/tree/master/recipeNo029

与JNI玩得开心!