Linux开机自启动nginx,nacos,jar包

说明


开机设置自启动的方式有很多种,这里主要介绍俩种方式来操作,

首先需要写一个Shell脚本把需要启动的服务集中在一块。然后在服务器重启的时候执行该脚本

第一种方式:在/etc/rc.local文件中添加写好的Shell脚本,服务器启动的时候会执行里面的命令

第二种方式:使用 systemd服务管理器来执行脚本

这里提一嘴:

rc.local 脚本是在系统启动时执行的,但是它的执行顺序可能在某些情况下发生变化,具体取决于系统的配置。在较新的 Linux 发行版中,可能使用 systemd 或其他服务管理器来执行启动脚本,而不是传统的 rc.local 方式,在这种情况下,可以选择systemd 服务或者在其他地方配置执行脚本

然后,以上我涉及的俩种方式都阔以。

查看命令

1、检查 systemd 是否存在(输出为 systemd,则表示系统使用 systemd 作为初始化系统)

ps -p 1 -o comm=

 2、查找 rc.local 的启动状态

systemctl status rc-local.service

编写脚本


1、创建Shell路径

mkdir "your path"

2、创建脚本文件

touch initConfig.sh

3、编写脚本内容

vim initConfig.sh

里面的nacos,nginx,jar包的地址需要根据实际路径进行调整

#!/bin/bash


### 打印日志
exec > /usr/local/projectStartConfig/log.file 2>&1
# 脚本开始打印时间
echo "Script execution started: $(date)"
# 脚本结束打印时间
echo "Script execution completed: $(date)"

### 设置 JAVA_HOME 变量 (下面的服务需要使用JDK,但是服务器启动时找不到JdK, 需要先声明好JDK的位置)

# 第一种方式:设置固定位置(需要维护 不推荐)
# export JAVA_HOME=/usr/local/jdk/jdk1.8.0_301
# export PATH=$JAVA_HOME/bin:$PATH

# 第二种方式:通过读取/etc/profile文件的方式,动态的获取 JAVA_HOME (不需要维护 推荐)
set_java_home() {
    if [ -n "$JAVA_HOME" ] && [ -x "$JAVA_HOME/bin/java" ]; then
        return
    fi

    # 通过读取/etc/profile文件来获取JAVA_HOME
    if [ -f "/etc/profile" ]; then
        JAVA_HOME=$(grep -o 'JAVA_HOME=.*' /etc/profile | cut -d '=' -f 2)
    fi

    # 如果JAVA_HOME未被正确设置,则输出错误信息并退出脚本
    if [ -z "$JAVA_HOME" ] || [ ! -x "$JAVA_HOME/bin/java" ]; then
        echo "错误:未找到 Java。请安装 Java(JDK)并设置 JAVA_HOME 变量。"
        exit 1
    fi
}

# 调用函数设置 JAVA_HOME
set_java_home

# 将 JAVA_HOME 添加到 PATH 环境变量中
export PATH=$JAVA_HOME/bin:$PATH

# Function to check if a process is running
is_process_running() {
    local process_name=$1
    if /usr/bin/pgrep -f "$process_name" >/dev/null; then
        return 0 # Process is running
    else
        return 1 # Process is not running
    fi
}

### 环境变量
NGINX_BIN="/usr/local/nginx/sbin/nginx"
NACOS_BIN="/usr/local/soft/nacos/bin/startup.sh"

### nginx 
# Start Nginx if it's not running
if ! is_process_running "nginx"; then
    echo "Starting Nginx..."
    $NGINX_BIN
else
    echo "Nginx is already running."
fi

### Nacos
if ! is_process_running "nacos"; then
    echo "Starting Nacos..."
    $NACOS_BIN -m standalone
else
    echo "Nacos is already running."
fi

### 需要启动jar包



# MQ
if ! is_process_running "mq_receiver-1.0-SNAPSHOT.jar"; then
    echo "Starting mq_receiver-1.0-SNAPSHOT.jar"
    nohup java -jar /usr/local/ctp_mq_receiver-1.0-SNAPSHOT.jar > /usr/local/paycenter/log_mq.file 2>&1 &
else
    echo "mq_receiver-1.0-SNAPSHOT.jar is already running."
fi

# web
if ! is_process_running "web-1.0-SNAPSHOT.jar"; then
    echo "Starting web-1.0-SNAPSHOT.jar"
    nohup java -jar /usr/local/ctp_web-1.0-SNAPSHOT.jar > /usr/local/paycenter/log_web.file 2>&1 &
else
    echo "web-1.0-SNAPSHOT.jar is already running."
fi

echo "Startup script completed."

4、给脚本文件提权(不提权没有执行权限)

chmod +x initConfig.sh

第一种方式(rc.local)

1、将脚本添加到系统启动项
 

vim /etc/rc.local

image.png

在文件中添加刚刚添加脚本的绝对路径,后面是日志打印的路径,为了排查问题用

2、保存,结束

查看rc.local的执行权限,如果不够的话需要进行提权,不然是不生效的

ls -l /etc/rc.local

image.png


提权的命令

chmod +x /etc/rc.d/rc.local

到这里结束,rebbot测试即可

第二种方式(systemd )

1、创建 systemd 服务文件

/etc/systemd/system/ 目录下创建一个以 .service 结尾的文件,用于定义您的服务。假设服务文件名为 myscript.service。使用文本编辑器打开该文件,并添加以下内容:

[Unit]
Description=My Startup Script
After=network.target

[Service]
Restart=always
Type=simple
RestartSec=10
# 这里要填实际的地址
ExecStart=/usr/local/projectStartConfig/initConfig.sh
WorkingDirectory=/usr/local/projectStartConfig

[Install]
WantedBy=multi-user.target

Type
  1. Type=simple: 系统会尝试执行脚本,但是脚本会在启动后一直处于运行状态,直到脚本自行退出。如果脚本没有实现后台运行的逻辑,它将会阻塞系统启动进程,直到脚本退出。这可能会导致启动过程较长或出现问题。

  2. Type=forking: 系统也会尝试执行脚本,但是脚本会被作为后台进程运行。当脚本执行完毕并退出时,服务进程也会退出。如果脚本实现了后台运行的逻辑,脚本会一直在后台持续运行,直到系统关机或服务被手动停止。

 Restart

  • no:服务退出后不会自动重启。
  • always:无论服务是正常退出还是非正常退出,都会自动重启。
  • on-failure:只有在服务非正常退出时(即退出状态不为 0),才会自动重启。
  • on-abnormal:只有在服务异常退出时(例如收到 SIGSEGV 或 SIGBUS 信号),才会自动

保存并退出文件

2、设置系统启动时自动运行

systemctl enable myscript.service

reboot -> 测试

补充

为什么现在新版本是用systemd 管理而不用rc.local了?

systemd 是 Linux 系统中较新的初始化系统,取代了传统的 init 系统,而 rc.localinit 系统中的一个脚本,在系统启动时被调用。systemd 的设计目标是提供更快速、并行和高度优化的系统初始化和管理过程,以及更好的系统状态跟踪和管理。相比于传统的 init 系统,systemd 提供了更多的功能和特性,包括:

1、并行启动:systemd 可以并行地启动系统服务,提高启动速度。

2、单位文件:systemd 使用单元(Unit)文件来定义和管理系统服务。每个服务都有对应的 .service 单元文件。

3、控制和状态跟踪:systemd 提供了用于控制和跟踪系统服务的工具,如 systemctl 命令。

4、依赖性管理:systemd 可以根据服务之间的依赖关系来启动和停止服务。

5、更好的日志管理:systemd 使用 journald 来记录系统日志,提供更好的日志管理和过滤功能。

由于 systemd 提供了更多的优势和功能,许多 Linux 发行版已经转向使用 systemd 作为默认的初始化系统。这也导致许多新版本的 Linux 系统不再使用传统的 rc.local 来管理启动脚本,而是通过 systemd 服务来管理启动和停止系统服务。这样可以更好地利用系统资源,提高系统性能,并提供更可靠和灵活的服务管理方式。


小坑


1、/usr/bin/bash^M: bad interpreter: No such file or directory
原因:

Windows 和 Unix 系统的换行符格式不同,Windows 使用回车符和换行符(CR+LF),而 Unix 使用换行符(LF)
解决办法:

# your script.sh path
sed -i 's/\r$//' /path/to/initStart.sh 


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值