用于java应用程序的Linux启动脚本

时间:2011-09-28 02:13:56

标签: java linux ubuntu startup redhat

我使用此命令在Linux中运行Jar文件:

java -jar SyslogAgent_01.jar 192.168.2.154 1998 D:/apachelog.log ApacheLog 13

任何人都可以让我知道如何在重新启动计算机时自动创建脚本并实现此过程吗?在windows中我们使用服务但是linux怎么样? 你可以向我提供脚本和步骤,因为我在Linux中真的很新......

Linux:RHat,Ubuntu

由于

6 个答案:

答案 0 :(得分:3)

如果你想将应用程序作为linux守护进程(服务)checkout Java Wrapper运行:http://wrapper.tanukisoftware.com/doc/english/download.jsp

也检查这个答案(适用于Windows,但对于linux的更改有点):How to install a Java application as a service

答案 1 :(得分:2)

我会从这个模板开始,为启动脚本将SCRIPT_HOME重命名为正确的路径,并在没有任何扩展名的情况下调用此文件,然后在SSH中运行此命令。

chkconfig –add javaserver

请注意javaserver中的chkconfig是您在下面调用文件的方式,(无扩展名或无效)。

#!/bin/bash
#
# javaserver: Startup script for Any Server Application.
#
# chkconfig: 35 80 05
# description: Startup script for Any Server Application.

SCRIPT_HOME=/var/java_server;
export SCRIPT_HOME

start() {
        echo -n "Starting Java Server: "
        $SCRIPT_HOME/run.sh start
        sleep 2
        echo "done"
}

stop() {
        echo -n "Stopping Java Server: "
        $SCRIPT_HOME/run.sh stop
        echo "done"
}

# See how we were called.
case "$1" in
        start)
                start
                ;;
        stop)
                stop
                ;;
        restart)
                stop
                start
                ;;
        *)
                echo $"Usage: javaserver {start|stop|restart}"
                exit
esac

现在这里的脚本是run.sh(这可以用来代替模板,但我发现更容易使模板脚本小而且不可更改链接到我的主脚本,所以我再也不用再触摸它了。

下面的脚本是我发现的很少的脚本之一,实际上可以重新启动java程序而不关闭你当前运行的所有java程序,这个脚本只针对它首先打开的程序,所以它永远不会犯下任何错误,从未让我失败,在用户root上运行没问题 永远在后台运行您的程序(无需保持SSH打开)。

这是run.sh

#!/bin/bash
#
# chkconfig: 345 99 05 
# description: Java deamon script
#
# A non-SUSE Linux start/stop script for Java daemons.
#
# Set this to your Java installation
JAVA_HOME=/usr/bin/

scriptFile=$(readlink -fn $(type -p $0))                                        # the absolute, dereferenced path of this script file
scriptDir=$(dirname $scriptFile)                                                    # absolute path of the script directory
serviceNameLo="javaserver"                                                       # service name with the first letter in lowercase
serviceName="JavaServer"                                                           # service name
serviceUser="root"                                                                           # OS user name for the service
serviceGroup="root"                                                                         # OS group name for the service
applDir="/var/java_server"                                       # 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
javaArgs="MyJavaAppClass"                                                                  # arguments for Java launcher
javaCommandLine="$JAVA_HOME$javaCommand $javaArgs"   # command line to start the Java service application
javaCommandLineKeyword="MyJavaAppClass"                                   # 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"
   # Don't forget to add -H so the HOME environment variable will be set correctly.
   #sudo -u $serviceUser -H $SHELL -c "$cmd" || return 1
   su --session-command="$javaCommandLine >>$serviceLogFile 2>&1 & echo \$! >$pidFile" $serviceUser || 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

答案 2 :(得分:1)

虽然不建议sudo这样的项目,但可以通过以下方式完成:

sudo crontab -e

将以下内容放在cron中:

@reboot java -jar SyslogAgent_01.jar 192.168.2.154 1998 D:/apachelog.log ApacheLog 13

答案 3 :(得分:0)

首先,您可能想要编辑您的本地IP,以了解您提供的更多信息。无论如何只需打开一个新文档类型

 #!/bin/bash

 #put your commands in here

保存然后打开终端并输入chmod + x nameofscript

我不确定ubuntu但是在arch上我们有一个在启动时运行命令的地方。 我的建议是在我知道的菜单中转到system-&gt; prefernces-&gt;启动应用程序或其他东西。

键入脚本的路径,即 的/ home /用户名/ scrips / myawesomescript

答案 4 :(得分:0)

基本上,您需要在/etc/init.d中创建一个小shell脚本,并将符号链接添加到/etc/rc2.d和/etc/rc5.d。内容可能是这样的:

#!/bin/sh
if [ "$1" = start ] ; then
    cd /put_your_workdir_here
    /usr/bin/java -jar SyslogAgent_01.jar 192.168.2.154 1998 D:/apachelog.log ApacheLog 13 &
fi

请注意,您在后台(&amp;在命令行末尾)启动程序

答案 5 :(得分:0)

您需要创建一个unix shell脚本文件,它将为您自动执行该作业。 以下是创建脚本文件的步骤: http://www.linuxquestions.org/questions/linux-general-1/shell-script-for-jar-utility-769461/