概述

涉及:1)sh 无法直接运行java命令,可以软连,此处是直接路径

2)sh脚本报一堆空格换行错误:需将转成unix标准格式;

#切换到上传的脚本路径
dos2unix 脚本文件名.sh

2)SELINUX 授权允许启动sh 脚本

3)SELINUX 授权允许启动写入的日志文件

软连接方法(无需操作)

cd /usr/bin
ln -s -f /usr/local/jdk17/java

操作步骤

1、新建sh 脚本

 新建:service_script.sh 脚本

注:需要配置
1)jdk的路径;2)程序日志路径;3)java 名称;4)启动端口

#!/bin/bash 
#这里替换为jar包名字
APP_NAME=hy-admin.jar
#根据实际情况修改参数
JVM="-server -Xms4g -Xmx4g"
#APPFILE_PATH="-Dspring.config.location=/usr/local/config/application.properties"

#定义java路径,无则会在get_java_home获取系统变量
JAVA_HOME=""

#使用说明,用来提示输入参数 
usage() { 
    echo "Usage: sh 执行脚本.sh [start|stop|restart|status|log|backup] [port]" 
    exit 1 
} 

port=$2 
#检查指定端口是否是有程序在运行
is_exist(){
    # 默认端口
    if [ "${port}" == "" ]; then
    # 默认使用9000
	port=9000
    fi 
    # 获取端口占用的进程号
    pid=`lsof -i:$port | awk 'NR == 2' | awk '{print  $2}'`
    #如果不存在返回1,存在返回0
    if [ -z "${pid}" ]; then 
        return 1 
    else 
        return 0 
    fi 
} 

#启动方法 
start(){ 
    is_exist 
    if [ $? -eq "0" ]; then 
        echo "${port} 端口已经被 ${pid} 进程占用" 
    else 
        #nohup ${JAVA_HOME}/bin/java $JVM -jar $APPFILE_PATH $APP_NAME > /dev/null 2>&1 
                #后台启动jar包,且控制环境变量,根据实际情况修改吧。
        #nohup java $JVM -jar $APP_NAME --spring.profiles.active=prod > /dev/null 2>&1 &
	cd /data/hy-cost-grain-pro
	echo "">log.file
	nohup ${JAVA_HOME}/bin/java -jar ${APP_NAME} --server.port=${port} >log.file  2>&1 &
	echo " ${APP_NAME} 进程 $! 在 ${port} 端口启动中......"
	log
    fi
} 

#停止方法 
stop(){ 
    is_exist 
    if [ $? -eq "0" ]; then 
        kill -9 $pid
	echo "${port} 端口的进程 ${pid} 已经被中断" 
    else 
        echo "${port} 端口未启用" 
    fi 
} 

#输出运行状态 
status(){ 
    is_exist 
    if [ $? -eq "0" ]; then 
        echo "${port} 端口已被进程  ${pid} 占用" 
    else 
        echo "${port} 端口未被占用" 
    fi 
} 
#重启 
restart(){ 
    stop 
    start 
} 


#调试方法 
debug(){ 
    is_exist 
    if [ $? -eq "0" ]; then 
        echo "${port} 端口已经被 ${pid} 进程占用" 
    else 
		# 获取JAVA_HOME
		get_java_home

		cd ${APP_PATH}
		#nohup java $JVM -jar $APPFILE_PATH $APP_NAME > /dev/null 2>&1 
        #后台启动jar包,且控制环境变量,根据实际情况修改吧。
        #nohup java $JVM -jar $APP_NAME --spring.profiles.active=prod > /dev/null 2>&1 &
		nohup ${JAVA_HOME}/bin/java $JVM \
		-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5006 \
		-jar ${APP_NAME} \
		--server.port=${port} \
		> /dev/null 2>&1 &
		echo " ${APP_NAME} 进程 $! 在 ${port} 端口启动中......"
		log
    fi
}

#日志
log(){
        # 输出实时日志
    tail -n 100 -f log.file
}

#备份
backup(){
        #根据需求自定义备份文件路径。
    BACKUP_PATH=./back/
        #获取当前时间作为备份文件名
    BACKUP_DATE=`date +"%Y%m%d(%H:%M:%S)"`
    echo 'backup file ->'$BACKUP_PATH$BACKUP_DATE'.jar'
        #备份当前jar包
    cp -r ./$APP_NAME  $BACKUP_PATH$BACKUP_DATE'.jar'
}

# 获取JAVA_HOME
get_java_home(){
    # 1、如果JAVA_HOME 不为空,则退出
	if [ -n "${JAVA_HOME}" ]; then
		return
	fi
	
	#2、通过java程序查找(如果是子shell 可能读不到)
	JAVA_PATH=$(which java)
	if [ -n "${JAVA_PATH}" ]; then
		# 获取java的上2级作为JAVA_HOME
		JAVA_HOME=$(dirname "$(dirname "$JAVA_PATH")")
	else
		#3、读取不到,则读取配置文件
		JAVA_HOME=$(grep -m 1 'JAVA_HOME=' /etc/profile | awk -F= '{print $2}' | tr -d ' ')
	fi
}

# 获取JAVA_HOME
get_java_home

#根据输入参数,选择执行对应方法,不输入则执行使用说明 
case "$1" in 
    "start") 
        start 
        ;; 
    "stop") 
        stop 
        ;; 
    "status") 
        status 
        ;; 
    "restart") 
        restart 
        ;; 
    "debug") 
        debug
        ;;
    "log") 
        log 
        ;; 
    "backup") 
        backup 
        ;; 
    *) 
usage 
;; 
esac

注:

1)脚本含远程调试 :agentlib

具体链接idea远程调试代码的步骤:

IDEA远程执行详解icon-default.png?t=N7T8https://www.cnblogs.com/lingluo2017/p/11529679.html

2)注意上传的.sh脚本转成系统可识别的unix编码格式的文件

上传后切换到脚本路径:运行如下命令

dos2unix service_script.sh

2、生成日志文件并授权

SELINUX 允许启动写入日志的文件;2-3步骤,理论也可以关闭SELINUX

echo ''>/data/hy-cost-grain-pro/log.file
chmod 777 /data/hy-cost-grain-pro/log.file

#授予启动脚本写入
semanage fcontext -a -t var_log_t /data/hy-cost-grain-pro/log.file
restorecon -Rv /data/hy-cost-grain-pro/log.file

#查看授权
semanage fcontext -l|grep var_log_t

3、授权启动脚本启动权限

设置 SELINUX 允许启动运行的脚步,2-3步骤,

#允许运行启动脚本
semanage fcontext -a -t init_exec_t /data/hy-cost-grain-pro/service_script.sh
restorecon -R -v /data/hy-cost-grain-pro/service_script.sh

#查看授权
semanage fcontext -l|grep init_exec_t

或者关闭selinux(见下面)并授权

chmod 777 /data/hy-cost-grain-pro/service_script.sh

4、新建启动服务文件

新建 java-grain-9000.service 文件

[Unit]
#服务描述 -一般跟项目一直
Description=java-cost-grain-pro
#服务在某服务后启动,一般是网络(这里需要根据实际微调)
After=NetworkManager.target
[Service]
Type=simple
#延迟启动,如果jar包需要运用到数据库,所以在这加了睡眠10秒
ExecStartPre=/bin/sleep 10 
ExecStart=/data/hy-cost-grain-pro/service_script.sh start
ExecReload=/data/hy-cost-grain-pro/service_script.sh restart
ExecStop=/data/hy-cost-grain-pro/service_script.sh stop
#服务意外退出,Systemd也会尝试自动重新启动服务
Restart=always

[Install]
WantedBy=multi-user.target

1)上面的 After= 值 可能因系统不同

centos 可能是是 network.target 、rocky高版本是  NetworkManager.target ,你也可以选在在mysqld 服务后面启动 mysqld.service ,查找服务名方式如下

#列出服务,并查找mysqld服务 
systemctl list-unit-files | grep mysqld
#你可能用的是
systemctl list-unit-files | grep network

2)上面启动服务脚本:假设在非root用户上传操作的程序

需要 指定运行 服务运行的 用户 和 项目空间:User、WorkingDirectory

[Unit]
#服务描述 -一般跟项目一直
Description=java-cost-grain-pro
#服务在某服务后启动,一般是网络(这里需要根据实际微调)
After=NetworkManager.target
[Service]
Type=simple
#延迟启动,如果jar包需要运用到数据库,所以在这加了睡眠10秒
ExecStartPre=/bin/sleep 10 
ExecStart=/data/hy-cost-grain-pro/service_script.sh start
ExecReload=/data/hy-cost-grain-pro/service_script.sh restart
ExecStop=/data/hy-cost-grain-pro/service_script.sh stop
#服务意外退出,Systemd也会尝试自动重新启动服务
Restart=always
User=用户名
WorkingDirectory=/data/hy-cost-grain-pro

[Install]
WantedBy=multi-user.target

5、上传并加入开机自动

上传至 :/etc/systemd/system

#刷新服务配置
systemctl daemon-reload
# 启动服务
systemctl start java-grain-9000.service
# 服务开机自启
systemctl enable java-grain-9000.service
# 停止服务
systemctl stop java-grain-9000.service
# 查看服务状态
systemctl status java-grain-9000.service -l
#运行查看倒数50行
tail -fn 50 /data/hy-cost-grain-pro/log.file
#运行实时查看日志
tail -f /data/hy-cost-grain-pro/log.file

重启,测试开机自启,启动花了15s

reboot

 

 可能问题:

1)无:lsof 命令

yum install lsof

 2) SELinux 介绍

SELinux 有三种工作模式,注意:没有特别安全要求,可以使permissive;不同级别配置相同;

  1. enforcing:强制模式。任何违反策略的行为都会被禁止,并且产生警告信息。

  2. permissive:允许模式。违反策略的行为不会被禁止,只产生警告信息。

  3. disabled:关闭 SELinux。

3)selinux 永久关闭

一、临时关闭

setenforce 0

注意:重启系统后还会开启。

二、永久关闭
1、vim /etc/selinux/config,SELINUX=disabled,然后保存退出。

2、 vim /etc/sysconfig/selinux,SELINUX=disabled,然后保存退出。

注意:如未生效重启即可 

三、验证方法
输入命令:getenforce  

4)若切换路径的数据库也能自启:请参考本人博客

Centos(rocky,red Hat) yum 安装mysql,切换路径并设置开机自启

Centos(rocky,red Hat) yum 安装mysql,切换路径并设置开机自启_rocky和red hat_小云小白的博客-CSDN博客1、安装方式介绍mysql安装共3中方式1)yum安装,最简单的方式2)rpm包安装,切记下载相应系统的 稳定版 源码包,相对较简单3)压缩包安装:自由度高,但配置相应复杂,且需要自己注册自启服务注:1,2,3无法在一台机器上共存,1,2可以通过mulit-mysql启动多个服务看,但无法实现:单机上的myql主从只有3方式支持1台安装多个mysql服务,实现mysql主从一、安装步骤1.获取最新的yum rmp包地址下载地址:MySQL :: MySQL Commu_rocky和red hathttps://blog.csdn.net/qq_26408545/article/details/124114793?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22124114793%22%2C%22source%22%3A%22qq_26408545%22%7D

Logo

加入「COC·上海城市开发者社区」,成就更好的自己!

更多推荐