侧边栏壁纸
  • 累计撰写 32 篇文章
  • 累计创建 13 个标签
  • 累计收到 1 条评论

目 录CONTENT

文章目录

CentOS7-设置开机自启动

javalx
2023-07-02 / 0 评论 / 0 点赞 / 22 阅读 / 19245 字

前言

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

输出日志到自定义文件

配置日志输出策略

  1. 新建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
    
    
  2. 重启日志rsyslog服务

    [root@localhost system]# systemctl restart rsyslog.service 
    
    

指定服务日志处理方式

  1. 修改服务配置文件

    [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
    
  2. 刷新服务配置文件

    [root@localhost system]# systemctl daemon-reload
    

测试日志重定向

  1. 重启服务

    [root@localhost system]# systemctl stop mose-api.service
    [root@localhost system]# systemctl start mose-api.service
    
  2. 查看日志

    [root@localhost system]# tail -200f /home/server_space/ucd/mose-admin.log 
    

问题分析解决

问题:发现日志并未重定向写入 /home/server_space/ucd/mose-admin.log 下
  1. 查看系统日志

    [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 ]
    
  2. 文件赋予权限重试

    [root@localhost system]# chomd -R 755 /home/server_space/ucd/xxl-job-admin.log
    
  3. 问题依然存在,网络查找

    • 发现是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
0

评论区