记录一下Linux安装解压版的Redis相关

前言:

前面帮朋友的朋友维护一台服务器,在维护的时候看见该Linux服务器使用的是解压版的Redis,而且有好多个Redis服务,搞不懂当初的运维怎么设计的(挠头),每次服务器重启之后呢,都要挨个进入目录启动,想想都要头痛,干脆弄个脚本配成服务让他在服务器启动的时候开机自启吧,还不用挨个进目录去启动,以下是配置Redis解压版配置为服务器开机自启时遇到问题和解决等。

编写服务

说干就干,就在网上随便找了篇博客照着写了个脚本如下

/etc/systemd/system目录下创建个redis.service服务文件,

1
$ nano /etc/systemd/system/redis.service

填入以下命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[Unit]
Description=The redis-server Process Manager
After=syslog.target network.target

[Service]
Type=simple
PIDFile=/var/run/redis_63791.pid
ExecStart=/tmhc/redis_63791/src/redis-server /tmhc/redis_63791/redis.conf
#ExecStop=/usr/local/bin/redis-cli -a hmhc2017good -p 63791 shutdown
#ExecReload=/bin/kill -s HUP $MAINPID
ExecReload=/bin/kill -USR2 $MAINPID
ExecStop=/bin/kill -SIGINT $MAINPID

[Install]
WantedBy=multi-user.target

注:文件描述

  • /var/run/redis_63791.pid

    该文件是Redis启动后的进程编号存储文件,可在redis.conf文件中同样找到

  • /tmhc/redis_63791/src/redis-server

    该文件是Redis的服务文件

  • /tmhc/redis_63791/redis.conf

    该文件是Redis的服务文件,以上服务文件可在redis.conf中的daemonize属性值为no的时候可用

然后照着博客上的,保存后重新加载服务配置文件,以服务的形式启动等

1
2
3
4
5
6
7
8
# 重新加载服务配置文件
$ systemctl daemon-reload

# 启动Redis服务
$ systemctl start redis.service

# 查看服务状态,
$ systemctl start redis.service

结果服务没有启动,报了什么 (code=exited, status=0/SUCCESS)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@iZbp1d4tisi44jrbwiev71Z system]# systemctl status redis.service 
● redis.service - The redis-server Process Manager
Loaded: loaded (/etc/systemd/system/redis.service; disabled; vendor preset: disabled)
Active: failed (Result: exit-code) since Thu 2022-01-06 14:25:55 CST; 2s ago
Process: 10943 ExecStop=/bin/kill -SIGINT $MAINPID (code=exited, status=1/FAILURE)
Process: 10941 ExecStart=/tmhc/redis_63791/src/redis-server /tmhc/redis_63791/redis.conf (code=exited, status=0/SUCCESS)
Main PID: 10941 (code=exited, status=0/SUCCESS)

Jan 06 14:25:55 iZbp1d4tisi44jrbwiev71Z kill[10943]: -s, --signal <sig> send specified signal
Jan 06 14:25:55 iZbp1d4tisi44jrbwiev71Z kill[10943]: -q, --queue <sig> use sigqueue(2) rather than kill(2)
Jan 06 14:25:55 iZbp1d4tisi44jrbwiev71Z kill[10943]: -p, --pid print pids without signaling them
Jan 06 14:25:55 iZbp1d4tisi44jrbwiev71Z kill[10943]: -l, --list [=<signal>] list signal names, or convert one to a name
Jan 06 14:25:55 iZbp1d4tisi44jrbwiev71Z kill[10943]: -L, --table list signal names and numbers
Jan 06 14:25:55 iZbp1d4tisi44jrbwiev71Z kill[10943]: -h, --help display this help and exit
Jan 06 14:25:55 iZbp1d4tisi44jrbwiev71Z kill[10943]: -V, --version output version information and exit
Jan 06 14:25:55 iZbp1d4tisi44jrbwiev71Z kill[10943]: For more details see kill(1).
Jan 06 14:25:55 iZbp1d4tisi44jrbwiev71Z systemd[1]: Unit redis.service entered failed state.
Jan 06 14:25:55 iZbp1d4tisi44jrbwiev71Z systemd[1]: redis.service failed.

一通百度,都是写牛头不对马嘴的各种其他问题,最后通过科学上网在Google上才找到了问题所在:

文章地址:https://forum.suse.org.cn/t/topic/10961 感谢大佬!

文章上有评论说道,原来是服务文件中的Type类型错了,把Type=simple改为Type=forking就可以了,修改后的文件如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
[Unit]
Description=The redis-server Process Manager
After=syslog.target network.target

[Service]
Type=forking
PIDFile=/var/run/redis_63791.pid
ExecStart=/tmhc/redis_63791/src/redis-server /tmhc/redis_63791/redis.conf
ExecReload=/bin/kill -USR2 $MAINPID
ExecStop=/bin/kill -SIGINT $MAINPID

[Install]
WantedBy=multi-user.target

重载服务文件后,启动查看状态如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[root@iZbp1d4tisi44jrbwiev71Z system]# nano redis.service 
[root@iZbp1d4tisi44jrbwiev71Z system]# systemctl status redis.service
● redis.service - The redis-server Process Manager
Loaded: loaded (/etc/systemd/system/redis.service; disabled; vendor preset: disabled)
Active: active (running) since Thu 2022-01-06 14:36:13 CST; 5min ago
Process: 11492 ExecStart=/tmhc/redis_63791/src/redis-server /tmhc/redis_63791/redis.conf (code=exited, status=0/SUCCESS)
Main PID: 11493 (redis-server)
CGroup: /system.slice/redis.service
└─11493 /tmhc/redis_63791/src/redis-server *:63791

Jan 06 14:36:13 iZbp1d4tisi44jrbwiev71Z systemd[1]: Starting The redis-server Process Manager...
Jan 06 14:36:13 iZbp1d4tisi44jrbwiev71Z redis-server[11492]: 11492:C 06 Jan 14:36:13.409 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
Jan 06 14:36:13 iZbp1d4tisi44jrbwiev71Z redis-server[11492]: 11492:C 06 Jan 14:36:13.409 # Redis version=4.0.2, bits=64, commit=00000000, modified=...started
Jan 06 14:36:13 iZbp1d4tisi44jrbwiev71Z redis-server[11492]: 11492:C 06 Jan 14:36:13.409 # Configuration loaded
Jan 06 14:36:13 iZbp1d4tisi44jrbwiev71Z systemd[1]: PID file /var/run/redis_63791.pid not readable (yet?) after start.
Jan 06 14:36:13 iZbp1d4tisi44jrbwiev71Z systemd[1]: Started The redis-server Process Manager.
Hint: Some lines were ellipsized, use -l to show in full.

服务启动正常!哎,困扰一下午的问题总算解决了!

在网上找了下Type=simple改为Type=forking的区别

  • simple类型

    Type=simple是一种最常见的通过systemd服务系统运行用户自定义命令的类型,也是省略Type指令时的默认类型。Type=simple类型的服务只适合那些在shell下运行在前台的命令。也就是说,当一个命令本身会以daemon模式运行时,将不能使用simple,而应该使用Type=forking。比如ls命令、sleep命令、非daemon模式运行的nginx进程以及那些以前台调试模式运行的进程,在理论上都可以定义为simple类型的服务。

  • forking类型

    使用Type=forking时,要求ExecStart启动的命令自身就是以daemon模式运行的。而以daemon模式运行的进程都有一个特性:总是会有一个瞬间退出的中间父进程,

    例如,nginx命令默认以daemon模式运行,所以可直接将其配置为forking类型:

原因找到了,我之前的Redis服务是以控制台命令的形式启动,然后避免关闭控制台服务不停止,将redis.conf中的daemonize属性值改为yes了,所以照着博客上面的服务文件写为simple类型启动是会不成功的,哎,还是对Linux中的systemd相关知识没有了解啊。

需要了解systemd 的详细信息,可前往:https://www.junmajinlong.com/linux/index/#systemd