Linux中开机自动启动中间件及服务

Linux中开机自动启动中间件及服务


方式一、使用 crontab(着重介绍)

crontab 是 Linux 下的计划任务,当时间达到我们设定的时间时,可以自动触发某些脚本的运行。

我们可以自己设置计划任务时间,然后编写对应的脚本。但是,有个特殊的任务,叫作 @reboot ,我们其实也可以直接从它的字面意义看出来,这个任务就是在系统重启之后自动运行某个脚本。可以用 crontab -e 来设置。

脚本文件:

#!/bin/bash
sleep 10
#docker
systemctl start docker
sleep 10
docker restart gogs
docker restart showdoc
#redis
cd /root/redis-5.0.14/src && ./redis-server ../redis.conf
#nginx
cd /root/nginx && ./sbin/nginx
#nacos
cd /root/nacos/bin && sh startup.sh -m standalone
#rocketmq
cd /root/rocketmq/rocketmq-all-5.1.4-source-release/distribution/target/rocketmq-5.1.4/rocketmq-5.1.4 && nohup sh bin/mqnamesrv &
#rocketmq控制台
cd /root/rocketmq/rocketmq-dashboard-master/target && java -jar rocketmq-dashboard-1.0.1-SNAPSHOT.jar &
#xxl-job
nohup java -jar /root/xxl-job/xxl-job-admin-2.3.1.jar > /dev/null 2> /dev/null &
nohup java -jar /root/xxl-job/xxl-job-executor-sample-springboot-2.3.1.jar > /dev/null 2> /dev/null &
#等待60秒
sleep 60
#万店通
sh /root/project/wdt/bin/restart.sh
crontab -e
@reboot sh /root/software/start_services.sh >> /root/software/startup.log 2>&1




介绍:
>>:将输出追加到 startup.log 文件中
2>&1:将错误信息也重定向到同一个日志文件

image-20241009183130948

image-20241009183202098

方式二、修改 /etc/rc.d/rc.local 文件

/etc/rc.d/rc.local 文件会在 Linux 系统各项服务都启动完毕之后再被运行。所以你想要自己的脚本在开机后被运行的话,可以将自己脚本路径加到该文件里。但是,首先需要确认你有运行这个文件的权限。

$ chmod 775 /root/software/start_services.sh

为了演示,我们创建了一个脚本,当它被执行之后,将在home目录下写入有指定信息的output.txt文件。

$ vim start_services.sh
#!/bin/bash

保存退出后,再给它赋予可执行权限:

$ chmod +x auto_run_script.sh

然后,我们再将脚本添加到 /etc/rc.d/rc.local 文件最后一行:

$ vim /etc/rc.d/rc.local
/home/auto_run_script.sh

然后,直接重启即可

方法三:使用 systemd 服务

本方法仅适用于 systemd 系统。如何区分是不是 systemd 系统?很简单,只需运行 ps aux 命令,查看 pid 为 1 的进程是不是 systemd

如果用户需要,可以将服务配置文件手动存放至用户配置目录/etc/systemd/system下。该目录下的服务配置文件可以是普通.service文件,也可以是链接至/usr/lib/systemd/system目录下服务配置文件的软链接

为了实现目的,我们需要创建一个 systemd 启动服务,并把它放置在/usr/lib/systemd/system/下,并在 /etc/systemd/system/ 目录创建链接文件(lrwxrwxrwx中的l表示链接文件,类似windows中的快捷方式;-代表普通文件;d表示为目录文件)指向源文件或者直接/etc/systemd/system/下创建.service文件

使用ln -s命令来创建一个软链接文件,语法为ln -s <目标文件> <链接文件路径>

例如:ln -s /usr/lib/systemd/system/nginx.service /etc/systemd/system/nginx.service

我们创建的 systemd 启动服务如下。请注意,这时后缀是 .service

一个.service配置文件分为三部分

  • Unit:定义该服务作为Unit角色时相关的属性
  • Service:定义本服务相关的属性
  • Install:定义本服务在设置服务开机自启动时相关的属性。换句话说,只有在创建/移除服务配置文件的软链接时,Install段才会派上用场。这一配置段不是必须的,当未配置[Install]时,设置开机自启动或禁止开机自启动的操作将无任何效果

[Unit][Install]段的配置指令都来自于man systemd.unit,这些指令都用于描述作为Unit时的属性,[Service]段则专属于.Service服务配置文件。详见:https://juejin.cn/post/7401066742070837260

DescriptionUnit的描述信息
Documentation本Unit的man文档路径
After本服务在哪些服务启动之后启动,仅定义启动顺序,不定义服务依赖关系,即使要求先启动的服务启动失败,本服务也依然会启动
Before本服务在哪些服务启动之前启动,仅定义启动顺序,不定义服务依赖关系。通常用于定义在关机前要关闭的服务,如Before=shutdown.target
Wants

本服务在哪些服务启动之后启动,定义服务依赖关系,不定义服务启动顺序。启动本服务时,如果被依赖服务未启动,则也会启动被依赖服务。如果被依赖服务启动失败,本服务不会受之影响,因此本服务会继续启动。如果未结合After使用,则本服务和被依赖服务同时启动。 当配置在[Install]段落中时,systemctl enable操作将会将本服务安装到对应的.wants目录下(在该目录下创建一个软链接),在开机自启动时,.wants目录中的服务会被隐式添加至目标Unit的Wants指令后。

DescriptionService的描述信息
PIDFilepid文件路径
ExecStart指定启动单元的命令或者脚本
ExecStartPre和ExecStartPost在ExecStart之前或者之后用户自定义执行的脚本
ExecReload单元重启时执行的命令或者脚本
ExecStop单元停止时执行的命令或者脚本
PrivateTmpTrue表示给服务分配独立的临时空间
Restart这个选项如果被允许,服务重启的时候进程会退出,会通过systemctl命令执行清除并重启的操作
User字段可以设置服务的用户名
Group字段可以设置服务的用户组
WorkingDirectory字段指定服务的安装目录
DescriptionInstall的描述信息
WantedBy本服务设置开机自启动时,在被依赖目标的.wants目录下创建本服务的软链接。例如WantedBy = multi-user.target时,将在/etc/systemd/multi-user.target.wants目录下创建本服务的软链接。
RequiredBy类似WantedBy,但是是在.requires目录下创建软链接。

例如:nginx.service

[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target

[Service]
Type=forking
PIDFile=/var/run/nginx.pid #指定nginx.pid的生成位置,需要在nginx.conf配置文件中配置,此文件没有回判断服务启动失败
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID

[Install]
WantedBy=multi-user.target

.service文件中各个字段含义如下

[Unit]     				
Description=demo	                  #当前配置文件的描述信息
After=network.target nginx.service    #表示当前服务是在那个服务后面启动,一般定义为网络服务启动后启动
 
[Service]
WorkingDirectory=/home/test                #工作目录				
Type=forking			                   #定义启动类型 
ExecStart=/home/test/demo-start.sh 	       #定义启动进程时执行的命令。
ExecReload=/home/test/demo-restart.sh      #重启服务时执行的命令
ExecStop=/home/test/demo-stop.sh		   #定义关闭进程时执行的命令。
PrivateTmp=true							   #是否分配独立空间
Restart=always
RestartSec=5
StartLimitInterval=0
StartLimitBurst=5
 
[Install]
WantedBy=multi-user.target    #表示多用户命令行状态

之后我们再运行下面两条命令来更新 systemd 配置文件,并启动服务。

$ systemctl daemon-reload
$ systemctl enable nginx.service

通过命名,查看所有的启动服务及状态

systemctl list-unit-files --type=service

附属一些自启动文件:

zookeeper的自启动文件

[Unit]
Description=zookeeper.service
Requires=network.target
After=network.target

[Service]
Type=forking
User=zookeeper
Group=zookeeper
Restart=on-failure
RestartSec=3
TimeoutStartSec=1min
PIDFILE=/zookeeper_data/2181/data/zookeeper_server.pid
Environment=JAVA_HOME=/usr/java/jdk1.8.0_191
Environment=ZOO_LOG_DIR=/opt/log/middleware/zookeeper
Environment=ZOO_LOG4J_PROP=INFO,ROLLINGFILE
Environment=CONF="/zookeeper_data/2181/zoo.cfg"
ExecStart=/usr/local/zookeeper/bin/zkServer.sh start $CONF
ExecStop=/usr/local/zookeeper/bin/zkServer.sh stop $CONF

[Install]
WantedBy=multi-user.target

kafka的自启动文件

[Unit]
Description=Kafka Daemon
After=zookeeper.service

[Service]
Type=simple
User=kafka
Group=kafka
LimitNOFILE=50000
Restart=on-failure
RestartSec=3
TimeoutStartSec=1min
Environment=JAVA_HOME=/usr/java/jdk1.8.0_191
Environment="LOG_DIR=/opt/log/middleware/kafka"
Environment="KAFKA_LOG4J_OPTS=-Dlog4j.configuration=file:/usr/local/kafka/config/log4j.properties"
Environment="KAFKA_HEAP_OPTS=-Xmx1G -Xms1G"
Environment=JMX_PORT=9192
ExecStart=/usr/local/kafka/bin/kafka-server-start.sh "/usr/local/kafka/config/server.properties"
ExecStop=/usr/local/kafka/bin/kafka-server-stop.sh "/usr/local/kafka/config/server.properties"

[Install]
WantedBy=multi-user.target

Redis的自启动配置文件

[Unit]
After=network.target
Description=Advanced key-value store
Documentation=http://redis.io/documentation

[Service]
Type=forking
ExecStart=/usr/local/redis/bin/redis-server /redis_data/6379/redis.conf
ExecStop=/bin/kill -s TERM $MAINPID
PIDFile=/redis_data/6379/redis.pid
TimeoutStopSec=0
Restart=always
User=redis
Group=redis
LimitNOFILE=65535

[Install]
WantedBy=multi-user.target
Linux系统,安装基础中间件通常涉及到下载源码并解压、安装编译工具、编译源码、启动服务等步骤。 以Redis为例,安装Redis可以按照以下步骤进行: 1. 下载Redis源码并解压:使用wget命令下载源码文件,然后使用tar命令解压缩。 2. 安装编译工具:使用yum命令安装make、gcc和tcl等编译工具。 3. 编译源码:进入解压后的Redis目录,使用make命令进行编译。可能会出现一些warning信息,可以忽略。 4. 启动Redis服务:在Redis目录下,使用src/redis-server命令启动Redis服务。可以使用nohup命令将服务放到后台运行。 5. 连接Redis数据库:使用src/redis-cli命令连接Redis数据库进行操作。 另外,在Linux系统,可以将Redis加入开机启动。可以按照以下步骤进行设置: 1. 创建并编辑/etc/systemd/system/redis.service文件,添加以下内容: ``` [Unit] Description=redis.server After=network.service <span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [linux中间件安装汇总](https://blog.csdn.net/weixin_43010385/article/details/122766590)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java小白笔记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值