Redis启动脚本应该在启动时创建一个pid文件,但我已经确认了我能找到的所有设置,并且没有创建过任何pid文件。
我安装了redis:
$ yum install redis
$ chkconfig redis on
$ service redis start
在我的配置文件(/etc/redis.conf)中,我检查确保这些已启用:
daemonize yes
pidfile /var/run/redis/redis.pid
在启动脚本(/etc/init.d/redis)中有:
exec="/usr/sbin/$name"
pidfile="/var/run/redis/redis.pid"
REDIS_CONFIG="/etc/redis.conf"
[ -e /etc/sysconfig/redis ] && . /etc/sysconfig/redis
lockfile=/var/lock/subsys/redis
start() {
[ -f $REDIS_CONFIG ] || exit 6
[ -x $exec ] || exit 5
echo -n $"Starting $name: "
daemon --user ${REDIS_USER-redis} "$exec $REDIS_CONFIG"
retval=$?
echo
[ $retval -eq 0 ] && touch $lockfile
return $retval
}
stop() {
echo -n $"Stopping $name: "
killproc -p $pidfile $name
retval=$?
echo
[ $retval -eq 0 ] && rm -f $lockfile
return $retval
}
这些是安装时默认提供的设置。知道为什么没有创建pid文件?我需要将它用于Monit。 (系统是RHEL 6.4 btw)
答案 0 :(得分:12)
对于那些遇到Debian破坏者的人:
编辑
nano /etc/systemd/system/redis.service
并将此行添加到redis [Service]
ExecStartPost=/bin/sh -c "echo $MAINPID > /var/run/redis/redis.pid"
它看起来应该像这样:
[Service]
Type=forking
ExecStart=/usr/bin/redis-server /etc/redis/redis.conf
ExecStop=/bin/kill -s TERM $MAINPID
ExecStartPost=/bin/sh -c "echo $MAINPID > /var/run/redis/redis.pid"
PIDFile=/run/redis/redis-server.pid
然后:
sudo systemctl daemon-reload
sudo systemctl restart redis.service
检查redis.service状态:
sudo systemctl status redis.service
pid文件现在应该出现。
答案 1 :(得分:11)
问题是用户redis没有权限创建pid文件(或它所在的目录)。修正:
sudo mkdir /var/run/redis
sudo chown redis /var/run/redis
然后我杀了并重新启动了redis,果然,还有redis.pid
答案 2 :(得分:8)
在CentOs 7中我需要添加到文件中:
$ vi /usr/lib/systemd/system/redis.service
下一行:
ExecStartPost=/bin/sh -c "echo $MAINPID > /var/run/redis/redis.pid"
然后重启服务:
$ sudo systemctl daemon-reload
$ sudo systemctl restart redis.service
参考:
答案 3 :(得分:8)
我在 Debian Buster 上遇到了类似的问题,即使文件存在且Redis正在运行,systemd仍会抱怨缺少PID文件。
在我的系统上,使用"echo $MAINPID > /run/redis/redis.pid"
的解决方案偶然起作用,尽管/因为实际的PID文件设置为/run/redis/redis-server.pid
(发现不同的文件名!) ,在我的系统上,/ run / redis / redis.pid(回声之一)的内容为空。
某人在discussion on systemd-devel@lists.freedesktop.org中写道:
... systemd会随时添加MAINPID环境变量 知道主要的PID是什么。它通过读取PID文件来了解这一点... 因此,在执行ExecStartPost时,主PID可能会或可能不会 。
具有空的MAINPID环境变量甚至可能有害:如果在建议的解决方案中注意到不同的PID文件名,并对其进行更正,则可能会出现以下情况:redis写入的PID文件被空文件覆盖。这件事发生在我身上,结果是systemctl start redis.service
从未完成。
我还注意到另一台具有100%相同操作系统和配置,但硬件不同的服务器没有此问题。
我的结论是,它刚好遇到某种竞争状况,systemd似乎过早地寻找PID文件。在我的系统上,无论我用作ExecStartPost的命令是什么,它都会增加足够的延迟以使错误消失。
因此,一种解决方案是使用“ sleep 1”(sleep 0.1也可以使用,但是安全起见可能需要1秒):
ExecStartPost=/bin/sleep 1
/etc/systemd/system/redis.service现在看起来像:
[Service]
Type=forking
ExecStart=/usr/bin/redis-server /etc/redis/redis.conf
ExecStartPost=/bin/sleep 1
ExecStop=/bin/kill -s TERM $MAINPID
PIDFile=/run/redis/redis-server.pid
...
一种替代解决方案是使用“受监督的systemd”:
/etc/redis/redis.conf:
# If you run Redis from upstart or systemd, Redis can interact with your
# supervision tree. Options:
# supervised no - no supervision interaction
# supervised upstart - signal upstart by putting Redis into SIGSTOP mode
# supervised systemd - signal systemd by writing READY=1 to $NOTIFY_SOCKET
# supervised auto - detect upstart or systemd method based on
# UPSTART_JOB or NOTIFY_SOCKET environment variables
# Note: these supervision methods only signal "process is ready."
# They do not enable continuous liveness pings back to your supervisor.
supervised systemd
使用以下命令覆盖redis-server.service文件:
systemctl edit redis-server.service
并输入以下内容:
[Service]
Type=notify
重新加载服务,错误应该消失了:
sudo systemctl restart redis.service
sudo systemctl status redis.service
答案 4 :(得分:5)
在我的Ubuntu 18.04上,我遇到了相同的错误。
redis
报告的错误(在/var/log/redis/redis-server.log
上):
# Creating Server TCP listening socket ::1:6379: bind: Cannot assign requested address
这是因为我已在此主机上禁用了IPv6,并且Ubuntu的redis-server
软件包(版本5:4.0.9-1)随附:
bind 127.0.0.1 ::1
编辑/etc/redis/redis.conf
并注释行,或删除::1
地址即可解决此问题。例:
# bind 127.0.0.1 ::1
答案 5 :(得分:2)
从2018年开始
开始之前,我在Ubuntu 18.04上,如果有人来了,我写了这个 通过搜索相同的错误。
就我而言,错误是相同的,但问题是如此不同。这里提出的解决方案均无效。
因此,我检查了日志是否存在,并寻找有用的东西。找到他们;
cat /var/log/redis/redis-server.log
搜索日志,发现问题在于另一项服务监听相同端口。
2963:C 21 Sep 11:07:33.007 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
2963:C 21 Sep 11:07:33.008 # Redis version=4.0.9, bits=64, commit=00000000, modified=0, pid=2963, just started
2963:C 21 Sep 11:07:33.008 # Configuration loaded
2974:M 21 Sep 11:07:33.009 # Creating Server TCP listening socket 127.0.0.1:6379: bind: Address already in use
我检查了谁在听。
netstat anp | grep 6379
找到了。
tcp6 0 0 :::6379 :::* LISTEN 3036/docker-proxy
这是另一个工具安装的redis的docker镜像
root@yavuz:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a6a94d401700 redis:3.2 "docker-entrypoint.s…" 20 hours ago Up 3 hours 0.0.0.0:6379->6379/tcp incubatorsuperset_redis_1
所以我停止了docker image
root@yavuz:~# docker stop incubatorsuperset_redis_1
Redis服务器启动没有问题。
root@yavuz:~# systemctl start redis-server
root@yavuz:~# systemctl status redis-server
● redis-server.service - Advanced key-value store
Active: active (running) since Fri 2018-09-21 11:10:34 +03; 1min 49s ago
Process: 3671 ExecStart=/usr/bin/redis-server /etc/redis/redis.conf (code=exited, status=0/SUCCESS)
答案 6 :(得分:0)
对于在Ubuntu 18.04上无法正常运行的人们,您需要编辑/etc/redis/redis.conf
并将pidfile声明更新为以下内容:
pidfile "/var/run/redis/redis-server.pid"
答案 7 :(得分:0)
sudo nano /etc/redis/redis.conf
在文件内,找到受监管的指令。该指令允许您声明一个初始化系统来将Redis作为服务进行管理,从而为您提供对其操作的更多控制。默认情况下,受监管指令设置为no。由于您正在运行使用systemd初始化系统的Ubuntu,因此请将其更改为systemd。
答案 8 :(得分:0)
对于 CentOS:
在我的例子中 Redis 服务器的名称是 redis.service
,启动它编辑
systemctl edit redis.service
添加:
[Service]
ExecStartPost=/bin/sh -c "echo $MAINPID > /var/run/redis/redis.pid"
PIDFile=/var/run/redis/redis.pid
我的情况是它创建文件:/etc/systemd/system/redis.service.d/override.conf
重启服务后:
systemctl daemon-reload
systemctl restart redis
pid 文件是:
cat /var/run/redis/redis.pid
=> 19755
答案 9 :(得分:-1)
Ubuntu18。/var/run/redis具有错误的权限: drwxr-sr-x 2 redis redis 60 Apr 27 12:22 redis
更改为755(drwxrwxr-x),现在显示pid文件。