web-dev-qa-db-ja.com

Redisがsystemctlで始まらない

Ubuntu 16.04マシンにredisをインストールしました。/usr/local/bin/redis-server /etc/redis/cluster/7000/redis.confを実行すると、起動して問題なく接続できます。

ただし、systemctl start redisを使用して起動したいので、/etc/systemd/system/redis7000.serviceに次のファイルを作成しました

[Unit]
Description=Redis In-Memory Data Store
After=network.target

[Service]
User=redis
Group=redis
ExecStart=/usr/local/bin/redis-server /etc/redis/cluster/7000/redis.conf
ExecStop=/usr/local/bin/redis-cli shutdown
Restart=always

[Install]
WantedBy=multi-user.target

そして、redis設定にはsupervised systemdが設定されています

見た目は良いと思いますが、次のエラーが表示されます。

Jan 19 14:54:27 ip-172-31-42-18 systemd[1]: Started Redis In-Memory Data Store.
Jan 19 14:54:27 ip-172-31-42-18 redis-server[21661]: 21661:C 19 Jan 14:54:27.680 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
Jan 19 14:54:27 ip-172-31-42-18 redis-server[21661]: 21661:C 19 Jan 14:54:27.680 # Redis version=4.0.6, bits=64, commit=00000000, modified=0, pid=21661, just started
Jan 19 14:54:27 ip-172-31-42-18 redis-server[21661]: 21661:C 19 Jan 14:54:27.680 # Configuration loaded
Jan 19 14:54:27 ip-172-31-42-18 redis-server[21661]: 21661:C 19 Jan 14:54:27.680 # systemd supervision requested, but NOTIFY_SOCKET not found
Jan 19 14:54:27 ip-172-31-42-18 systemd[1]: redis7000.service: Main process exited, code=exited, status=1/FAILURE
Jan 19 14:54:27 ip-172-31-42-18 systemd[1]: redis7000.service: Unit entered failed state.
Jan 19 14:54:27 ip-172-31-42-18 systemd[1]: redis7000.service: Failed with result 'exit-code'.
Jan 19 14:54:27 ip-172-31-42-18 systemd[1]: redis7000.service: Service hold-off time over, scheduling restart.
Jan 19 14:54:27 ip-172-31-42-18 systemd[1]: Stopped Redis In-Memory Data Store.

そして、私はこれが何を意味するのかさえわからないので、誰かが私を正しい方向に導くことができますか?

7
munHunger

Systemdでredisを実行するには、supervised systemdを設定する必要があります。

構成ファイルを参照してください。

# 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 no

次のように変更する必要があります。

supervised systemd

これをコマンドラインで渡すこともできます。これにより、redis.confの設定が上書きされます。 Red Hatベースのシステムがこれを行います。これにより、設定ファイルを変更せずに、手動またはsystemdから同じredisインスタンスを実行することもできます。

ExecStart=/usr/bin/redis-server /etc/redis.conf --supervised systemd

さらに、Type=notifyセクションで[Service]を設定して、redisがこのモードで動作することをsystemdに通知する必要もあります。

13
Michael Hampton

評判がないためコメントを追加できませんので、マイケル・ハンプストンの回答へのコメントとしてご利用ください。

systemdサービスファイルを変更する場合は、コマンドsystemctl edit redis-serverを使用してオーバーライドを作成します。表示される編集ウィンドウで、次のように入力します。

[Service]
Type=notify

保存して終了し、インストールを完了しますapt install -f

/lib/systemd/systemでサービスを変更すると、次の更新時にそれらの編集内容が失われます。

参照: 上流のユニットファイルを変更せずにsystemdユニットファイルを変更

PS:この問題により、問題が発生したばかりなので頭を悩ませる必要がなくなりました。

6
AnthonyK

これをデバッグする方法の1つは、ExecStart行をコピーしてターミナルで実行することです。この場合、エラーが頻繁に発生します。したがって、デバッグおよび解決するためのより多くのヒントが得られます。

私は同じことをして、正確なエラーを得て解決しました。

0
Viraj.Hadoop