• Start Java program as Linux daemon


    ApexNinjas | Start Java program as Linux daemon


       
     
       
     
    Start Java program as Linux daemon
    Author: GEORGE BARA1 comment(s)Category: OS & Web ServersPosted on: 16-02-2011
     
     

    Use this script to run Java programs as daemons (services) on Linux Centos (or other Red Hat releases). This script originates from a script use to do the same thing in Linux Suse and was adapted for Centos by Joshua Davis. Save the code below in a sh file (Ex.: daemon.sh), set the variables at the beginning of the script. To start/stop the daemon using daemon.sh, just use:

    ./daemon.sh start

    ./daemon.sh stop

    ./daemon.sh status

    #!/bin/bash
    #
    # chkconfig: 345 99 05 
    # description: Java deamon script
    #
    # A non-SUSE Linux start/stop script for Java daemons.
    #
    # Derived from -
    # Home page: http://www.source-code.biz
    # License:   GNU/LGPL (http://www.gnu.org/licenses/lgpl.html)
    # Copyright 2006 Christian d'Heureuse, Inventec Informatik AG, Switzerland.
    #
    # History:
    # 2010-09-21 Josh Davis: Changed 'sudo' to 'su', fix some typos, removed unused variables
    # 2009-03-04 Josh Davis: Ubuntu/Redhat version.
    # 2006-06-27 Christian d'Heureuse: Script created.
    # 2006-07-02 chdh: Minor improvements.
    # 2006-07-10 chdh: Changes for SUSE 10.0.
    
    
    # Set this to your Java installation
    JAVA_HOME=/usr/java/latest
    
    serviceNameLo="myservice"                                  # service name with the first letter in lowercase
    serviceName="MyService"                                    # service name
    serviceUser="appuser"                                      # OS user name for the service
    serviceGroup="appgroup"                                    # OS group name for the service
    applDir="/var/lib/$serviceNameLo"                          # home directory of the service application
    serviceUserHome="/home/$serviceUser"                       # home directory of the service user
    serviceLogFile="/var/log/$serviceNameLo.log"               # log file for StdOut/StdErr
    maxShutdownTime=15                                         # maximum number of seconds to wait for the daemon to terminate normally
    pidFile="/var/run/$serviceNameLo.pid"                      # name of PID file (PID = process ID number)
    javaCommand="java"                                         # name of the Java launcher without the path
    javaExe="$JAVA_HOME/bin/$javaCommand"                      # file name of the Java application launcher executable
    javaArgs="-jar $applDir/myservice.jar"                     # arguments for Java launcher
    javaCommandLine="$javaExe $javaArgs"                       # command line to start the Java service application
    javaCommandLineKeyword="myservice.jar"                     # a keyword that occurs on the commandline, used to detect an already running service process and to distinguish it from others
    
    # Makes the file $1 writable by the group $serviceGroup.
    function makeFileWritable {
       local filename="$1"
       touch $filename || return 1
       chgrp $serviceGroup $filename || return 1
       chmod g+w $filename || return 1
       return 0; }
    
    # Returns 0 if the process with PID $1 is running.
    function checkProcessIsRunning {
       local pid="$1"
       if [ -z "$pid" -o "$pid" == " " ]; then return 1; fi
       if [ ! -e /proc/$pid ]; then return 1; fi
       return 0; }
    
    # Returns 0 if the process with PID $1 is our Java service process.
    function checkProcessIsOurService {
       local pid="$1"
       if [ "$(ps -p $pid --no-headers -o comm)" != "$javaCommand" ]; then return 1; fi
       grep -q --binary -F "$javaCommandLineKeyword" /proc/$pid/cmdline
       if [ $? -ne 0 ]; then return 1; fi
       return 0; }
    
    # Returns 0 when the service is running and sets the variable $pid to the PID.
    function getServicePID {
       if [ ! -f $pidFile ]; then return 1; fi
       pid="$(<$pidFile)"
       checkProcessIsRunning $pid || return 1
       checkProcessIsOurService $pid || return 1
       return 0; }
    
    function startServiceProcess {
       cd $applDir || return 1
       rm -f $pidFile
       makeFileWritable $pidFile || return 1
       makeFileWritable $serviceLogFile || return 1
       cmd="nohup $javaCommandLine >>$serviceLogFile 2>&1 & echo \$! >$pidFile"
       su -m $serviceUser -s $SHELL -c "$cmd" || return 1
       sleep 0.1
       pid="$(<$pidFile)"
       if checkProcessIsRunning $pid; then :; else
          echo -ne "\n$serviceName start failed, see logfile."
          return 1
       fi
       return 0; }
    
    function stopServiceProcess {
       kill $pid || return 1
       for ((i=0; i<maxShutdownTime*10; i++)); do
          checkProcessIsRunning $pid
          if [ $? -ne 0 ]; then
             rm -f $pidFile
             return 0
             fi
          sleep 0.1
          done
       echo -e "\n$serviceName did not terminate within $maxShutdownTime seconds, sending SIGKILL..."
       kill -s KILL $pid || return 1
       local killWaitTime=15
       for ((i=0; i<killWaitTime*10; i++)); do
          checkProcessIsRunning $pid
          if [ $? -ne 0 ]; then
             rm -f $pidFile
             return 0
             fi
          sleep 0.1
          done
       echo "Error: $serviceName could not be stopped within $maxShutdownTime+$killWaitTime seconds!"
       return 1; }
    
    function startService {
       getServicePID
       if [ $? -eq 0 ]; then echo -n "$serviceName is already running"; RETVAL=0; return 0; fi
       echo -n "Starting $serviceName   "
       startServiceProcess
       if [ $? -ne 0 ]; then RETVAL=1; echo "failed"; return 1; fi
       echo "started PID=$pid"
       RETVAL=0
       return 0; }
    
    function stopService {
       getServicePID
       if [ $? -ne 0 ]; then echo -n "$serviceName is not running"; RETVAL=0; echo ""; return 0; fi
       echo -n "Stopping $serviceName   "
       stopServiceProcess
       if [ $? -ne 0 ]; then RETVAL=1; echo "failed"; return 1; fi
       echo "stopped PID=$pid"
       RETVAL=0
       return 0; }
    
    function checkServiceStatus {
       echo -n "Checking for $serviceName:   "
       if getServicePID; then
    	echo "running PID=$pid"
    	RETVAL=0
       else
    	echo "stopped"
    	RETVAL=3
       fi
       return 0; }
    
    function main {
       RETVAL=0
       case "$1" in
          start)                                               # starts the Java program as a Linux service
             startService
             ;;
          stop)                                                # stops the Java program service
             stopService
             ;;
          restart)                                             # stops and restarts the service
             stopService && startService
             ;;
          status)                                              # displays the service status
             checkServiceStatus
             ;;
          *)
             echo "Usage: $0 {start|stop|restart|status}"
             exit 1
             ;;
          esac
       exit $RETVAL
    }
    
    main $1
  • 相关阅读:
    Jenkins-在windows上配置自动化部署(Jenkins+Gitblit)
    GIT-Linux(CentOS7)系统部署GitLab服务器
    VMware 安装Linux系统 CentOS
    GIT-windows系统下Gitblit的使用方式
    SQL 显示所有表所占存储空间
    通过JavaScript更新UpdatePanel备忘
    Entity Framework调用表值函数实现全文检索?
    转载:javascript 拖拽排序,简洁示例备忘
    c++ 读写注册表
    MSSQL中建立分区表(转载备忘)
  • 原文地址:https://www.cnblogs.com/lexus/p/2364103.html
Copyright © 2020-2023  润新知