2016-02-12 307 views
0

我有一個胖的jar文件,我想通過將其作爲服務運行來控制它。我不是一個shell腳本專家,但是從了這個博客帖子一些啓示:啓動腳本運行Jar

http://vertx.io/blog/vert-x-3-init-d-script/

我再修改了一點我的需求如下:

#!/bin/bash 

### 
# chkconfig: 345 20 80 
# description: Vert.x application service script 
# processname: java 
# 
# Installation (CentOS): 
# copy file to /etc/init.d 
# chmod +x /etc/init.d/my-vertx-application 
# chkconfig --add /etc/init.d/my-vertx-application 
# chkconfig my-vertx-application on 
# 
# Installation (Ubuntu): 
# copy file to /etc/init.d 
# chmod +x /etc/init.d/my-vertx-application 
# update-rc.d my-vertx-application defaults 
# 
# 
# Usage: (as root) 
# service my-vertx-application start 
# service my-vertx-application stop 
# service my-vertx-application status 
# 
### 

# The directory in which your application is installed 
APPLICATION_DIR="/Users/joe/Desktop/temp/tsdb-kafka-consumer" 
# The fat jar containing your application 
APPLICATION_JAR="tsdb-kafka-consumer-0.1.0-SNAPAHOT.jar" 
# The application argument such as -Dfoo=bar ... 
APPLICATION_ARGS="-Dlogback.configurationFile=prod-logger.xml -Dconfig.resource=application.integration.conf" 
# The Java command to use to launch the application (must be java 8+) 
#JAVA=/opt/java/java/bin/java 

# *********************************************** 
LOG_FILE="${APPLICATION_DIR}" 
RUNNING_PID="${APPLICATION_DIR}"/RUNNING_PID 
# *********************************************** 

# colors 
red='\e[0;31m' 
green='\e[0;32m' 
yellow='\e[0;33m' 
reset='\e[0m' 

echoRed() { echo -e "${red}$1${reset}"; } 
echoGreen() { echo -e "${green}$1${reset}"; } 
echoYellow() { echo -e "${yellow}$1${reset}"; } 

# Check whether the application is running. 
# The check is pretty simple: open a running pid file and check that the process 
# is alive. 
isrunning() { 
    # Check for running app 
    if [ -f "$RUNNING_PID" ]; then 
    proc=$(cat $RUNNING_PID); 
    if /bin/ps --pid $proc 1>&2 >/dev/null; 
    then 
     return 0 
    fi 
    fi 
    return 1 
} 

start() { 
    if isrunning; then 
    echoYellow "The Vert.x application is already running" 
    return 0 
    fi 

    pushd $APPLICATION_DIR > /dev/null 
    nohup java $APPLICATION_ARGS -jar $APPLICATION_DIR/$APPLICATION_JAR > $LOG_FILE 2>&1 & 
    echo $! > ${RUNNING_PID} 
    popd > /dev/null 

    if isrunning; then 
    echoGreen "Kafka Consumer Application started" 
    exit 0 
    else 
    echoRed "Kafka Consumer Application has not started - check log" 
    exit 3 
    fi 
} 

restart() { 
    echo "Restarting Kafka Consumer Application" 
    stop 
    start 
} 

stop() { 
    echoYellow "Stopping Kafka Consumer Application" 
    if isrunning; then 
    kill `cat $RUNNING_PID` 
    rm $RUNNING_PID 
    fi 
} 

status() { 
    if isrunning; then 
    echoGreen "Kafka Consumer Application is running" 
    else 
    echoRed "Kafka Consumer Application is either stopped or inaccessible" 
    fi 
} 

case "$1" in 
start) 
    start 
;; 

status) 
    status 
    exit 0 
;; 

stop) 
    if isrunning; then 
    stop 
    exit 0 
    else 
    echoRed "Application not running" 
    exit 3 
    fi 
;; 

restart) 
    stop 
    start 
;; 

*) 
    echo "Usage: $0 {status|start|stop|restart}" 
    exit 1 
esac 

當我試圖運行這個腳本,我得到了以下錯誤:

Joes-MacBook-Pro:script joe$ sh ./run.sh start 
/bin/ps: illegal option -- - 
usage: ps [-AaCcEefhjlMmrSTvwXx] [-O fmt | -o fmt] [-G gid[,gid...]] 
      [-g grp[,grp...]] [-u [uid,uid...]] 
      [-p pid[,pid...]] [-t tty[,tty...]] [-U user[,user...]] 
     ps [-L] 
./run.sh: line 73: /Users/joe/Desktop/temp/tsdb-kafka-consumer: Is a directory 
/bin/ps: illegal option -- - 
usage: ps [-AaCcEefhjlMmrSTvwXx] [-O fmt | -o fmt] [-G gid[,gid...]] 
      [-g grp[,grp...]] [-u [uid,uid...]] 
      [-p pid[,pid...]] [-t tty[,tty...]] [-U user[,user...]] 
     ps [-L] 
-e \e[0;31mKafka Consumer Application has not started - check log\e[0m 

這是什麼問題?有什麼建議麼?

回答

1

--pid參數在您的OSX上無效。您應該將ps --pid更改爲isrunning()ps -p。這將適用於Linux和OSX。

+0

好的,謝謝!我擺脫了錯誤。現在觸及第二個錯誤。這行有什麼錯誤:nohup java $ APPLICATION_ARGS -jar $ {APPLICATION_DIR/APPLICATION_JAR}> $ LOG_FILE 2>&1& – sparkr

+0

我在第74行收到一個錯誤,說它是一個目錄! – sparkr

+0

@sparkr我想你不是指'$ {APPLICATION_DIR/APPLICATION_JAR}',而是'$ {APPLICATION_DIR}/$ {APPLICATION_JAR}'而不是? –