前言
CentOS7开机启动自定义脚本大致分为以下几种方式:
- 通过CentOS7的rc-local服务启动
- 使用CentOS7 systemctl 添加系统服务自启动
- 通过Linux下的chkconfig添加系统启动脚本
systemd自定义服务自启动
Nginx自启动
配置服务文件
在/lib/systemd/system下创建并编辑nginx.service
[root@localhost ~]# cd /lib/systemd/system
[root@localhost ~]# touch nginx.service
[root@localhost ~]# vim nginx.service
[Unit]
#描述服务
Description=nginx
#描述服务在指定服务周后启动
After=network.target
#服务运行参数的设置,注意【Service】的启动、重启、停止命令都要用绝对路径
[Service]
#后台运行的形式
Type=forking
#服务具体运行的命令
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
#重启命令
ExecReload=/usr/local/nginx/sbin/nginx -s reload
#停止命令
ExecStop=/usr/local/nginx/sbin/nginx -s quit
#表示给服务分配独立的临时空间
PrivateTmp=true
#运行级别下服务安装的相关设置,可设置为多用户,即系统运行级别为3
[Install]
WantedBy=multi-user.target
重新加载服务配置文件
[root@localhost ~]# systemctl daemon-reload
测试服务配置
[root@localhost ~]# systemctl start nginx.service
[root@localhost ~]# systemctl restart nginx.service
[root@localhost ~]# systemctl stop nginx.service
加入自启动
[root@localhost ~]# systemctl enable nginx.service
Redis自启动
配置服务文件
在/lib/systemd/system下创建并编辑redis.service
[root@localhost ~]# cd /lib/systemd/system
[root@localhost ~]# touch redis.service
[root@localhost ~]# vim redis.service
[Unit]
#描述服务
Description=redis
#描述服务在指定服务周后启动
After=network.target
#服务运行参数的设置,注意【Service】的启动、重启、停止命令都要用绝对路径
[Service]
#后台运行的形式
Type=forking
#服务具体运行的命令
ExecStart=/usr/local/bin/redis-server /etc/redis/6379.conf
#重启命令
ExecReload=/usr/local/nginx/sbin/nginx -s reload
#停止命令
ExecStop=/usr/local/bin/redis-cli -h 127.0.0.1 -p 6379 shutdown
#表示给服务分配独立的临时空间
PrivateTmp=true
#运行级别下服务安装的相关设置,可设置为多用户,即系统运行级别为3
[Install]
WantedBy=multi-user.target
重新加载服务配置文件
[root@localhost ~]# systemctl daemon-reload
测试服务配置
[root@localhost ~]# systemctl start redis.service
[root@localhost ~]# systemctl restart redis.service
[root@localhost ~]# systemctl stop redis.service
加入自启动
[root@localhost ~]# systemctl enable redis.service
RocketMQ自启动
mqnamesrv自启动
配置文件rocketmq-ns.service:
[Unit]
Description=RocketMQ Namesrv
After=network.target remote-fs.target nss-lookup.target
Before=rocketmq-bk.service
[Service]
Type=simple
User=root
ExecStart=/home/rocketmq/bin/mqnamesrv
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
Restart=0
LimitNOFILE=65536
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=rocketmq-ns
[Install]
WantedBy=multi-user.target
broker自启动
配置文件rocketmq-bk.service:
[Unit]
Description=rocketmq-broker
After=network.target rocketmq-ns.service
[Service]
Type=sample
User=root
ExecStart=/home/rocketmq/bin/mqbroker -c /home/rocketmq/conf/broker.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
Restart=0
LimitNOFILE=65536
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=rocketmq-bk
[Install]
WantedBy=multi-user.target
Frp客户端服务自启动
配置文件frpc.service:
[Unit]
Description=Frp Client Service
After=network.target mose-api.target
Wants=mose-api.service
[Service]
Type=simple
User=nobody
Restart=on-failure
RestartSec=5s
ExecStart=/usr/bin/frpc -c /etc/frp/frpc.ini
ExecReload=/usr/bin/frpc reload -c /etc/frp/frpc.ini
LimitNOFILE=1048576
[Install]
WantedBy=multi-user.target
Java(jar包)服务自启动
Api服务自启动
配置文件mose-api.service:
[Unit]
Description=mose-api-serve
After=network.target rocketmq-bk.service mose-job.service
Wants=mose-job.service
Requires=rocketmq-bk.service
[Service]
Type=simple
User=root
ExecStart=/home/soft/jdk/bin/java -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=256m -Xms2048m -Xmx2048m -Xmn512m -Xss512m -XX:SurvivorRatio=8 -jar -Dspring.profiles.active=test /home/server_space/ucd/mose-admin.jar
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
Restart=0
LimitNOFILE=65536
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=mose-api
[Install]
WantedBy=multi-user.target
Job服务自启动
配置文件mose-job.service:
[Unit]
Description=mose-job-serve
After=network.target
[Service]
Type=simple
User=root
ExecStart=/home/soft/jdk/bin/java -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=128m -Xms1024m -Xmx1024m -Xmn256m -Xss256m -XX:SurvivorRatio=8 -jar -Dspring.profiles.active=test /home/server_space/ucd/xxl-job-admin.jar
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
Restart=0
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=mose-job
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
输出日志到自定义文件
配置日志输出策略
-
新建rsyslog日志处理服务转发策略
[root@localhost system]# cd /etc/rsyslog.d/ [root@localhost rsyslog.d]# ls listen.conf [root@localhost rsyslog.d]# touch moseApi.conf [root@localhost rsyslog.d]# touch moseJob.conf [root@localhost rsyslog.d]# touch rocketmqNS.conf [root@localhost rsyslog.d]# touch rocketmqBK.conf [root@localhost rsyslog.d]# vim moseApi.conf [root@localhost rsyslog.d]# vim moseJob.conf [root@localhost rsyslog.d]# vim rocketmqNS.conf [root@localhost rsyslog.d]# vim rocketmqBK.conf [root@localhost rsyslog.d]# ls listen.conf moseApi.conf moseJob.conf rocketmqBK.conf rocketmqNS.conf [root@localhost rsyslog.d]#
#moseApi.conf内容 if $programname == 'mose-api' then /home/server_space/ucd/mose-admin.log & :omusrmsg:stopp #moseJob.conf内容 if $programname == 'mose-job' then /home/server_space/ucd/xxl-job-admin.log & :omusrmsg:stopp #rocketmqNS.conf内容 if $programname == 'rocketmq-ns' then /var/log/rocketmq-namesrv.log & :omusrmsg:stopp #rocketmqBK.conf内容 if $programname == 'rocketmq-bk' then /var/log/rocketmq-broker.log & :omusrmsg:stopp
-
重启日志rsyslog服务
[root@localhost system]# systemctl restart rsyslog.service
指定服务日志处理方式
-
修改服务配置文件
[root@localhost system]# vim mose-api.service [root@localhost system]# vim mose-job.service [root@localhost system]# vim rocketmq-ns.service [root@localhost system]# vim rocketmq-bk.service
#mose-api.service变更内容 StandardOutput=syslog StandardError=syslog SyslogIdentifier=mose-api #mose-job.service变更内容 StandardOutput=syslog StandardError=syslog SyslogIdentifier=mose-job #rocketmq-ns.service变更内容 StandardOutput=syslog StandardError=syslog SyslogIdentifier=rocketmq-ns #rocketmq-bk.service变更内容 StandardOutput=syslog StandardError=syslog SyslogIdentifier=rocketmq-bk
-
刷新服务配置文件
[root@localhost system]# systemctl daemon-reload
测试日志重定向
-
重启服务
[root@localhost system]# systemctl stop mose-api.service [root@localhost system]# systemctl start mose-api.service
-
查看日志
[root@localhost system]# tail -200f /home/server_space/ucd/mose-admin.log
问题分析解决
问题:发现日志并未重定向写入 /home/server_space/ucd/mose-admin.log 下
-
查看系统日志
[root@localhost system]# tail -1000f /var/log/message
May 29 20:32:56 localhost mose-job: Copyright @ 2021-2099 bjucd.com All Rights Reserved. May 29 20:32:56 localhost rsyslogd: action 'action 2' resumed (module 'builtin:omfile') [v8.24.0-55.el7 try http://www.rsyslog.com/e/2359 ] May 29 20:32:56 localhost rsyslogd: file '/home/server_space/ucd/xxl-job-admin.log': open error: Permission denied [v8.24.0-55.el7 try http://www.rsyslog.com/e/2433 ]
-
文件赋予权限重试
[root@localhost system]# chomd -R 755 /home/server_space/ucd/xxl-job-admin.log
-
问题依然存在,网络查找
-
发现是selinux 开启导致rsyslog 打开文件失败
-
关闭selinux 后重启服务器测试,日志可以重定向写入
-
由于自定义的路径的context不满足rsyslogd的访问权限,所以被selinux禁止访问了
-
最终解决方案
-
最终服务配置
RocketMQ自启动
mqnamesrv配置
[Unit]
Description=RocketMQ Namesrv
After=network.target remote-fs.target nss-lookup.target
Before=rocketmq-bk.service
[Service]
Type=simple
User=root
ExecStart=/home/rocketmq/bin/mqnamesrv
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
Restart=0
LimitNOFILE=65536
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=rocketmq-ns
[Install]
WantedBy=multi-user.target
broker配置
[Unit]
Description=rocketmq-broker
After=network.target rocketmq-ns.service
[Service]
Type=sample
User=root
ExecStart=/home/rocketmq/bin/mqbroker -c /home/rocketmq/conf/broker.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
Restart=0
LimitNOFILE=65536
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=rocketmq-bk
[Install]
WantedBy=multi-user.target
Java(jar包)服务自启动
Api配置
[Unit]
Description=mose-api-serve
After=network.target rocketmq-bk.service mose-job.service
Wants=mose-job.service
Requires=rocketmq-bk.service
[Service]
Type=simple
User=root
ExecStart=/home/soft/jdk/bin/java -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=256m -Xms2048m -Xmx2048m -Xmn512m -Xss512m -XX:SurvivorRatio=8 -jar -Dspring.profiles.active=test /home/server_space/ucd/mose-admin.jar
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
Restart=0
LimitNOFILE=65536
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=mose-api
[Install]
WantedBy=multi-user.target
Job配置
[Unit]
Description=mose-job-serve
After=network.target
[Service]
Type=simple
User=root
ExecStart=/home/soft/jdk/bin/java -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=128m -Xms1024m -Xmx1024m -Xmn256m -Xss256m -XX:SurvivorRatio=8 -jar -Dspring.profiles.active=test /home/server_space/ucd/xxl-job-admin.jar
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
Restart=0
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=mose-job
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
systemd运行服务配置详解
rc.local服务自启动执行脚本
创建启动脚本jenkins_auto.sh
#!/bin/sh
#chkconfig: 2345 80 90
#description: 开机自启动jenkins服务
export JAVA_HOME=/home/soft/jdk
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib/dt.jar:${JAVA_HOME}/lib/tool.jar
export PATH=${JAVA_HOME}/bin:$PATH
sleep 10
nohup java -Dhudson.util.ProcessTree.disable=true -Xms10240m -Xmx10240m -jar /home/jenkins/jenkins.war --httpPort=10086 > /home/jenkins/jenkins.log 2>&1 &
赋予脚本执行权限
[root@localhost init.d]# chmod +x /etc/rc.d/init.d/jenkins_auto.sh
为脚本赋予自启动权限
[root@localhost init.d]# vim /etc/rc.d/rc.local
#!/bin/bash
# THIS FILE IS ADDED FOR COMPATIBILITY PURPOSES
#
# It is highly advisable to create own systemd services or udev rules
# to run scripts during boot instead of using this file.
#
# In contrast to previous versions due to parallel execution during boot
# this script will NOT be run after all other services.
#
# Please note that you must run 'chmod +x /etc/rc.d/rc.local' to ensure
# that this script will be executed during boot.
touch /var/lock/subsys/local
/etc/rc.d/init.d/jenkins_auto.sh
~ ~
为rc.local赋予执行权限
CentOS7默认为rc.local降级了,所以给他开开执行权限
[root@localhost init.d]# chmod +x /etc/rc.d/rc.local
查看rc-local服务
- 如果rc-local服务是停止的,则启动rc-local服务并查看jenkins脚本是否随着自启动jenkins的Jar包
- 如果rc-local服务是启动的,则杀掉jenkins服务进程,重启rc-local服务并验证jenkins的Jar包是否随着自启动
[root@localhost init.d]# systemctl status rc-local
● rc-local.service - /etc/rc.d/rc.local Compatibility
Loaded: loaded (/usr/lib/systemd/system/rc-local.service; static; vendor preset: disabled)
Active: active (running) since 二 2023-05-30 15:03:06 CST; 45min ago
Process: 1830 ExecStart=/etc/rc.d/rc.local start (code=exited, status=0/SUCCESS)
Main PID: 3045 (java)
Tasks: 108
CGroup: /system.slice/rc-local.service
└─3045 java -Dhudson.util.ProcessTree.disable=true -Xms10240m -Xmx10240m -jar /home/jenkins/jenkins.war --httpPort=10086
5月 30 15:02:56 localhost.localdomain systemd[1]: Starting /etc/rc.d/rc.local Compatibility...
5月 30 15:03:06 localhost.localdomain systemd[1]: Started /etc/rc.d/rc.local Compatibility.
[root@localhost init.d]#
[root@localhost init.d]# ps -ef | grep jenkins
root 3045 1 3 15:03 ? 00:01:48 java -Dhudson.util.ProcessTree.disable=true -Xms10240m -Xmx10240m -jar /home/jenkins/jenkins.war --httpPort=10086
root 74420 47111 0 15:52 pts/2 00:00:00 grep --color=auto jenkins
[root@localhost init.d]# kill -9 3045
[root@localhost init.d]# ps -ef | grep jenkins
root 74985 47111 0 15:53 pts/2 00:00:00 grep --color=auto jenkins
[root@localhost init.d]# systemctl restart rc-local
[root@localhost init.d]# tail -f /home/jenkins/jenkins.log
2023-05-30 07:53:53.257+0000 [id=1] INFO o.e.j.s.handler.ContextHandler#doStart: Started w.@7927bd9f{Jenkins v2.361.1,/,file:///root/.jenkins/war/,AVAILABLE}{/root/.jenkins/war}
2023-05-30 07:53:53.278+0000 [id=1] INFO o.e.j.server.AbstractConnector#doStart: Started ServerConnector@16022d9d{HTTP/1.1, (http/1.1)}{0.0.0.0:10086}
2023-05-30 07:53:53.289+0000 [id=1] INFO org.eclipse.jetty.server.Server#doStart: Started Server@290dbf45{STARTING}[10.0.11,sto=0] @1631ms
2023-05-30 07:53:53.291+0000 [id=49] INFO winstone.Logger#logInternal: Winstone Servlet Engine running: controlPort=disabled
2023-05-30 07:53:53.530+0000 [id=55] INFO jenkins.InitReactorRunner$1#onAttained: Started initialization
2023-05-30 07:53:53.764+0000 [id=121] INFO jenkins.InitReactorRunner$1#onAttained: Listed all plugins
2023-05-30 07:53:56.929+0000 [id=179] INFO jenkins.InitReactorRunner$1#onAttained: Prepared all plugins
2023-05-30 07:53:56.941+0000 [id=124] INFO jenkins.InitReactorRunner$1#onAttained: Started all plugins
2023-05-30 07:53:56.950+0000 [id=132] INFO jenkins.InitReactorRunner$1#onAttained: Augmented all extensions
2023-05-30 07:53:57.391+0000 [id=124] INFO h.p.b.g.GlobalTimeOutConfiguration#load: global timeout not set
2023-05-30 07:53:58.034+0000 [id=146] INFO jenkins.InitReactorRunner$1#onAttained: System config loaded
2023-05-30 07:53:58.036+0000 [id=159] INFO jenkins.InitReactorRunner$1#onAttained: System config adapted
2023-05-30 07:53:58.112+0000 [id=166] INFO jenkins.InitReactorRunner$1#onAttained: Loaded all jobs
2023-05-30 07:53:58.130+0000 [id=58] INFO jenkins.InitReactorRunner$1#onAttained: Configuration for all jobs updated
2023-05-30 07:53:58.143+0000 [id=197] INFO hudson.model.AsyncPeriodicWork#lambda$doRun$1: Started Download metadata
2023-05-30 07:53:58.150+0000 [id=197] INFO hudson.util.Retrier#start: Attempt #1 to do the action check updates server
2023-05-30 07:53:58.207+0000 [id=61] INFO jenkins.InitReactorRunner$1#onAttained: Completed initialization
2023-05-30 07:53:58.275+0000 [id=40] INFO hudson.lifecycle.Lifecycle#onReady: Jenkins is fully up and running
^C
[root@localhost init.d]# ps -ef | grep jenkins
root 76699 1 99 15:53 ? 00:00:49 java -Dhudson.util.ProcessTree.disable=true -Xms10240m -Xmx10240m -jar /home/jenkins/jenkins.war --httpPort=10086
root 77567 47111 0 15:54 pts/2 00:00:00 grep --color=auto jenkins
[root@localhost init.d]#
- 如果自启动失败,可以查看/var/log/message日志
设置rc-local服务自启动
[root@localhost init.d]# systemctl enable rc-local
通过chkconfig添加系统启动脚本
在CentOS7之前,可以通过chkconfig来配置开机自启动服务
chkconfig –-add xxx #把服务添加到chkconfig列表
chkconfig --del xxx #把服务从chkconfig列表中删除
chkconfig xxx on #开启开机自动启动
chkconfig xxx off #关闭开机自动启动
chkconfig --list #查看所有chklist中服务
chkconfig --list xxx #查看指定服务
在/etc/rc.d/init.d下新增脚本run.sh
#!/bin/bash
#chkconfig: 2345 80 90
#description: 开机自启动jenkins服务
export JAVA_HOME=/home/soft/jdk
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib/dt.jar:${JAVA_HOME}/lib/tool.jar
export PATH=${JAVA_HOME}/bin:$PATH
sleep 10
nohup java -Dhudson.util.ProcessTree.disable=true -Xms10240m -Xmx10240m -jar /home/jenkins/jenkins.war --httpPort=10086 > /home/jenkins/jenkins.log 2>&1 &
增加脚本的可执行权限
[root@localhost init.d]# chmod +x /etc/rc.d/init.d/run.sh
添加脚本到开机自动启动项目中
[root@localhost init.d]# cd /etc/rc.d/init.d
[root@localhost init.d]# chkconfig --add run.sh
[root@localhost init.d]# chkconfig run.sh on
评论区