我有一个胖jar文件,我想通过将其作为服务运行来控制。我不是shell脚本专家,但从这篇博文中获得了一些灵感:
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
这是什么问题?有什么建议吗?
答案 0 :(得分:1)
您的OSX上的--pid
参数无效。您应该将ps --pid
上的isrunning()
更改为ps -p
。这适用于Linux和OSX。