一、Linux部署Java项目的三种方法
1、简单后台启动
直接使用java -jar命令运行jar包,当退出或者关闭远程工具就会把进程关闭
java -jar your-application.jar
这里的your-application.jar应该替换为自己想要运行的jar文件的实际文件名。
java -jar your-application.jar --spring.profiles.active=product --server.port=8080 &
说明:此语句比第一个命令多一个&符号,&表示后台运行,ssh窗口不被锁定,但是关闭窗口时,程序还是会退出。
2、不挂断后台启动
nohup java -jar your-application.jar --spring.profiles.active=product --server.port=8080 & # 再输入查询日志打印命令 tail -f nohup.out # 这里可以指定打印日志的行数 tail -200 nohup.out
说明:nohup(no hang up)表示不挂断运行命令行,当账号退出或关闭终端时,程序仍然运行。
(1)单独使用 & , 只能实现在程序的执行期间,还能在当前会话中执行其他操作;但关闭当前会话,程序依然会自动结束。
(2)单独使用 nohup ,只能实现关闭当前会话后,程序依然能继续运行,但无法在当前会话中再执行其他操作。强行使用Ctrl+C中断的话,这时虽然可以在当前会话中执行其他操作,但是程序也结束运行了
(3)结合使用 nohup 和 & ,能同时实现:在程序的执行期间,还能在当前会话中执行其他操作;关闭当前会话后,程序依然能继续运行。
当用 nohup 命令执行时,会在当前的目录下生成nohup.out文件,该项目的所有日志都会被输出到该文件中,除非另外指定了输出文件。
3、不挂断后台启动并重定向日志
如果我们还想要指定输出文件,可以使用 > 或 >> 将输出重定向到文件中,例如:
nohup java -jar your-application.jar --spring.profiles.active=product --server.port=8080 >/data/platform/log/platform-scm.txt &
那么如何让 nohup 命令不产生大量的日志文件呢?
可以利用Linux的黑洞/dev/null,它就像一个无底洞,所有重定向到它的信息都会消失得无影无踪。这一点非常有用,当我们不需要回显程序的所有信息时,就可以将输出重定向到/dev/null。
# 程序的标准输出和标准错误输出都重定向到系统的“垃圾桶”中,从而达到不输出日志的效果。 nohup java -jar your-application.jar &>/dev/null & # 后台启动并且指定输出日志,控制台退出不会关掉应用 nohup java -jar your-application.jar >> ./your-application.log 2>&1
二、停止jar包后台运行
# 找到对应的进程然后杀掉 ps -ef | grep your-application.jar # ps -aux | grep 程序名:通过程序名找到进程信息 # 通过进程ID结束进程 kill -9 进程号
一条命令停止脚本:
kill -9 `ps -ef | grep your-application.jar | grep -v 'grep' `
说明:两次使用管道,排除其他进程,直接杀掉相应的进程。
三、停止脚本
#!/bin/bash cd `dirname $0` CUR_SHELL_DIR=`pwd` CUR_SHELL_NAME=`basename ${BASH_SOURCE}` #修改这里jar包名即可 demo-0.0.1-SNAPSHOT.jar #JAR_NAME="xxxxxxxxxxxx.jar" JAR_NAME="ty-listen-0.0.1-SNAPSHOT.jar" JAR_PATH=$CUR_SHELL_DIR/$JAR_NAME #JAVA_MEM_OPTS=" -server -Xms1024m -Xmx1024m -XX:PermSize=128m" JAVA_MEM_OPTS="" #SPRING_PROFILES_ACTIV="-Dspring.profiles.active=eureka2" SPRING_PROFILES_ACTIV="" LOG_DIR=$CUR_SHELL_DIR/logs LOG_PATH=$LOG_DIR/${JAR_NAME}.log echo_help() { echo -e "syntax: sh $CUR_SHELL_NAME start|stop" } if [ -z $1 ];then echo_help exit 1 fi if [ ! -d "$LOG_DIR" ];then mkdir "$LOG_DIR" fi if [ ! -f "$LOG_PATH" ];then touch "$LOG_DIR" fi if [ "$1" == "start" ];then # check server PIDS=`ps --no-heading -C java -f --width 1000 | grep $JAR_NAME | awk '{print $2}'` if [ -n "$PIDS" ]; then echo -e "ERROR: The $JAR_NAME already started and the PID is ${PIDS}." exit 1 fi echo "Starting the $JAR_NAME..." # start nohup java $JAVA_MEM_OPTS -jar $SPRING_PROFILES_ACTIV $JAR_PATH >> $LOG_PATH 2>&1 & COUNT=0 while [ $COUNT -lt 1 ]; do sleep 1 COUNT=`ps --no-heading -C java -f --width 1000 | grep "$JAR_NAME" | awk '{print $2}' | wc -l` if [ $COUNT -gt 0 ]; then break fi done PIDS=`ps --no-heading -C java -f --width 1000 | grep "$JAR_NAME" | awk '{print $2}'` echo "${JAR_NAME} Started and the PID is ${PIDS}." echo "You can check the log file in ${LOG_PATH} for details." elif [ "$1" == "stop" ];then PIDS=`ps --no-heading -C java -f --width 1000 | grep $JAR_NAME | awk '{print $2}'` if [ -z "$PIDS" ]; then echo "ERROR:The $JAR_NAME does not started!" exit 1 fi echo -e "Stopping the $JAR_NAME..." for PID in $PIDS; do kill $PID > /dev/null 2>&1 done COUNT=0 while [ $COUNT -lt 1 ]; do sleep 1 COUNT=1 for PID in $PIDS ; do PID_EXIST=`ps --no-heading -p $PID` if [ -n "$PID_EXIST" ]; then COUNT=0 break fi done done echo -e "${JAR_NAME} Stopped and the PID is ${PIDS}." else echo_help exit 1 fi
三、重启脚本
kill -9 `ps -ef | grep your-application.jar | grep -v 'grep' ` sleep 2 nohup java -jar your-application.jar --spring.profiles.active=product --server.port=8080 & sleep 2 tail -f nohup.out