Скрипт запуска Linux для Java-приложения - PullRequest
1 голос
/ 28 сентября 2011

У меня есть файл Jar для запуска в Linux с помощью этой команды:

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

Может кто-нибудь дать мне знать, как создать сценарий и реализовать этот процесс автоматически, пока мы перезагружаем наш компьютер?В Windows мы используем службы, но как насчет Linux?Можете ли вы предоставить мне сценарий и шаг, чтобы сделать это, так как я действительно новичок в Linux ...

Linux: RHat, Ubuntu

Спасибо

Ответы [ 6 ]

3 голосов
/ 28 сентября 2011

Если вы хотите запустить приложение как извлечение демона (службы) linux Java Wrapper: http://wrapper.tanukisoftware.com/doc/english/download.jsp

Проверьте этот ответ тоже (для Windows, но для Linux немного меняется): Как установить приложение Java в качестве службы

2 голосов
/ 14 февраля 2014

Я бы начал с этого шаблона для сценария запуска, переименуйте 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
1 голос
/ 28 сентября 2011

Хотя не рекомендуется использовать такие элементы как sudo, это можно сделать следующим образом:

sudo crontab -e

Поместите в cron следующее:

@reboot java -jar SyslogAgent_01.jar 192.168.2.154 1998 D:/apachelog.log ApacheLog 13
0 голосов
/ 28 сентября 2011

вам нужно создать файл сценария оболочки Unix, который автоматизирует работу для вас.Вот шаги для создания файла сценария: http://www.linuxquestions.org/questions/linux-general-1/shell-script-for-jar-utility-769461/

0 голосов
/ 28 сентября 2011

По сути, вам нужно создать небольшой скрипт оболочки в /etc/init.d и сделать символические ссылки на /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

Обратите внимание, что вы запускаете программу в фоновом режиме (& в конце командной строки)

0 голосов
/ 28 сентября 2011

Э-э, сначала вы можете захотеть отредактировать свой локальный IP-адрес, который предоставит вам больше информации.В любом случае, просто откройте новый тип документа:

 #!/bin/bash

 #put your commands in here

Сохраните, затем откройте терминал и введите chmod + x nameofscript

Я не уверен насчет Ubuntu, но в Arch у нас есть место для запуска командна старте.Мой совет - перейти в system-> Предпочтения-> Запустить приложения или что-то в этом духе, в этом меню, которое я знаю.

Введите путь к сценарию, например / home / username / scrips / myawesomescript

...