Redis守护进程没有创建PID文件

时间:2014-08-26 21:08:04

标签: redis rhel6

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)

10 个答案:

答案 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

参考:

CentOs 7: Systemd & PID File

答案 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文件。