前言
最近在公司服务器上面部署了一个测试环境,因为经常改东西,所以总是需要重启,于是想把项目搞成自动启动,正好最近喜欢用systemd来管理软件,所以研究了下整个项目利用systemd自动开机启动的方法,特此记录。
历史上,Linux 的启动一直采用init进程,这种方法启动时间长且启动脚本复杂。
Systemd 就是为了解决这些问题而诞生的。它的设计目标是,为系统的启动和管理提供一套完整的解决方案。
根据 Linux 惯例,字母d
是守护进程(daemon)的缩写。 Systemd 这个名字的含义,就是它要守护整个系统。
使用了 Systemd,就不需要再用init
了。Systemd 取代了initd
,成为系统的第一个进程(PID 等于 1),其他进程都是它的子进程。
通用模板
项目涉及到的组件包括,达梦数据库、nginx、redis、nacos和Java程序,具体部署就不赘述了。其中达梦是图形化安装后,默认给你配置好systemd了,剩下的nginx相对是最简单的,直接按照教程就完成了。一般的步骤就是在/usr/lib/systemd/system中增加xxx.service的文件,以nginx为例,就是nginx.service,然后编辑以下内容。
[Unit]
Description=nginx service #名称
After=network.target #启动网络后在启动此单元
[Service]
Type=forking #静默模式
ExecStart=/usr/local/nginx/sbin/nginx #启动命令
ExecReload=/usr/local/nginx/sbin/nginx -s reload #重启命令
ExecStop=/usr/local/nginx/sbin/nginx -s quit #关闭命令
PrivateTmp=true #独立的临时空间
[Install]
WantedBy=multi-user.target #用户级别
这个里面的注释以及中间的空格记得删干净,否则报错。
这个基本上就是通用模板,但弄完只有nginx不添加其他参数能顺利执行。
设置程序启动顺序
全部按照通用模板设置后,执行systemctl daemon-reload刷新systemd的配置文件。
将所有东西执行enable设置好开机启动后,重启电脑看结果。首先看到的是nacos启动失败,查看nacos日志得知nacos需要联动redis才能运行,所以查找资料如何设置先启动redis再启动nacos,在unit添加依赖关系的设置如下。
[Unit]
Description=nacos service
After=network.target redis.service
Requires=redis.service
但因为redis还有报错,且设置了依赖关系,所以redis报错nacos也会无法启动。而且实测即使我手动启动redis,因为systemd无法正确读取redis状态,所以依然无法启动nacos,所以接下来解决redis的问题。
设置redis
平时启动redis都是直接运行/usr/local/bin里面的redis-server启动文件的,但在systemd里面直接设置就是启不起来,拿着日志问豆包才知道,在systemd找不到配置文件了。所以要在ExecStart补上一个配置文件地址。
[Service]
Type=forking
ExecStart=/usr/local/bin/redis-server /opt/redis-7.0.5/redis.conf
PrivateTmp=true
redis.service改完后,此时还需要做一个设置,就是在redis文件夹中修改配置文件redis.conf,将daemonize no改为daemonize yes,这个设置是将静默模式打开,否则无法用systemd管理redis进程。
设置nacos
但redis成功后,nacos还是报错,还是选择报豆包大腿,告诉我是缺少了java定向。需要在service里面加上java地址。
[Service]
Type=forking
Environment="JAVA_HOME=/opt/jdk1.8.0_201"
ExecStart=/opt/nacos/bin/startup.sh
ExecStop=/opt/nacos/bin/shutdown.sh
PrivateTmp=true
同理后端java程序启动的配置也加上这段。
总结
项目本体java服务是开发提供的脚本,直接按照通用模板配置systemd即可。
最后设置nginx和redis正常启动,nacos依赖redis,java服务依赖nacos和达梦,reboot重启后顺利启动整个项目。
总结就是用systemd自启动整个项目,首先要注意单元之间的依赖关系,设置先后顺序以保证项目正常启动。其次就是有些服务,用启动文件能直接启动,但把启动文件直接配置到systemd的service列表里面,启动过程中会找不到某些东西,需要看情况增加设置,比如redis需要指定配置文件地址,nacos需要指定java_home,有条件可以把日志丢给豆包帮忙,小豆豆我爱你。