说明
开机设置自启动的方式有很多种,这里主要介绍俩种方式来操作,
首先需要写一个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
在文件中添加刚刚添加脚本的绝对路径,后面是日志打印的路径,为了排查问题用
2、保存,结束
查看rc.local的执行权限,如果不够的话需要进行提权,不然是不生效的
ls -l /etc/rc.local
提权的命令
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
-
Type=simple
: 系统会尝试执行脚本,但是脚本会在启动后一直处于运行状态,直到脚本自行退出。如果脚本没有实现后台运行的逻辑,它将会阻塞系统启动进程,直到脚本退出。这可能会导致启动过程较长或出现问题。 -
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.local
是 init
系统中的一个脚本,在系统启动时被调用。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