2016-02-12 183 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}'而不是? –