redis SHUTDOWN出錯問題解決

啓動Redis以後,在停掉的時候報錯了,以下:程序員

c80k2@ubuntu:/usr/local/redis$ bin/redis-cli shutdown
(error) ERR Errors trying to SHUTDOWN. Check logs.

須要查看日誌。那日誌在哪裏呢?進配置文件 redis.conf 查看:redis

# Specify the log file name. Also the empty string can be used to force
# Redis to log on the standard output. Note that if you use standard
# output for logging but daemonize, logs will be sent to /dev/null
logfile ""

在這裏的logfile被用來設置日誌的文件名。若是是空字符串,講迫使Redis用標準輸出的方式來進行記錄。同時要注意,若是使用了標準輸出來記錄,但Redis被設置爲 daemonize 也就是常駐進程,日誌將被髮送到 /dev/null。shell

可是咱們嘗試去查看/dev/null文件時,發現它是一個c類型文件,也就是 字符設備文件。數據庫

l是連接: link
d是目錄: directory
c是字符設備文件: character special file
b是塊設備: block special file
-是文件: regular fileubuntu

關於/dev/null這個文件, bash

在類Unix系統中,/dev/null,或稱空設備,是一個特殊的設備文件,它丟棄一切寫入其中的數據(但報告寫入操做成功),讀取它則會當即獲得一個EOF。
在程序員行話,尤爲是Unix行話中,/dev/null 被稱爲位桶(bit bucket)或者黑洞(black hole)。空設備一般被用於丟棄不須要的輸出流,或做爲用於輸入流的空文件。當你讀它的時候,它會提供無限的空字符(NULL, ASCII NUL, 0x00)。ide

其中的一個典型用法是cat $filename  會輸出filename對應的文件內容(輸出到標準輸出)
而使用         cat $filename >/dev/null 
則不會獲得任何信息,由於咱們將原本該經過標準輸出顯示的文件信息重定向到了 /dev/null 中,so what will you get ?
使用  cat $filename 1>/dev/null 也會獲得一樣的效果,由於默認重定向的 1 就是標準輸出。  若是你對 shell 腳本或者重定向比較熟悉的話,應該會聯想到 2,也即標準錯誤輸出。this

無論怎麼樣,爲了能更方便地查看日誌,咱們更改一下配置:日誌

logfile "/var/log/redis/redis.log"

 保存退出後,建立對應的日誌文件,並給上讀寫執行權限,這裏直接給了0777。code

重啓Redis,讓配置生效,再次嘗試關閉Redis,

bin/redis-cli SHUTDOWN

仍然報錯:

(error) ERR Errors trying to SHUTDOWN. Check logs.

查看日誌:

42661:M 30 May 10:45:15.477 # User requested shutdown...
42661:M 30 May 10:45:15.478 * Saving the final RDB snapshot before exiting.
42661:M 30 May 10:45:15.478 # Failed opening the RDB file dump.rdb (in server root dir /usr/local/redis) for saving: Permission denied
42661:M 30 May 10:45:15.478 # Error trying to save the DB, can't exit.

看到是由於保存RDB snapshot快照的時候,因爲權限問題,打開失敗,進而保存失敗,退出失敗。

進配置文件看看:

# The working directory.
#
# The DB will be written inside this directory, with the filename specified
# above using the 'dbfilename' configuration directive.
#
# The Append Only File will also be created inside this directory.
#
# Note that you must specify a directory here, not a file name.
dir ./

工做目錄: 數據庫DB將被寫入這個目錄,使用上面的 'dbfilename' 配置指令的文件名。AOF將一樣再這個目錄下被建立。注意你必須指明一個目錄,而不是文件名。

對應的dbfilename配置以下,也就是說redis的DB數據將被寫入這個文件。

# The filename where to dump the DB
dbfilename dump.rdb

而工做目錄被設置成當前的redis目錄 /usr/local/redis,看看目錄權限。

drwxr-xr-x  4 root root 4096 May 30 10:48 redis
c80k2@ubuntu:/usr/local/redis$ ps -aux | grep redis | grep -v grep
c80k2     36437  0.0  0.0  14388   692 pts/29   S+   May29   0:00 tail -f redis.log
c80k2     42661  0.0  0.0  51820  3992 ?        Ssl  10:44   0:00 bin/redis-server 127.0.0.1:6379
root      42677  0.0  0.0  61860  3920 pts/20   S+   10:48   0:00 sudo vi redis.conf
root      42678  0.0  0.2  61136  8608 pts/20   S+   10:48   0:00 vi redis.conf

而redis是以當前用戶權限運行的,沒有root權限。爲了解決這個問題,咱們講工做目錄進行設置,並給上0777權限。注意,這裏的權限是要從/usr/local/redis目錄給起的。

dir /usr/local/redis/redis_dbfiles
c80k2@ubuntu:/usr/local$ sudo chmod -R 0777 redis

從新啓動,讓配置生效,再次嘗試關閉,沒有報錯。

c80k2@ubuntu:/usr/local/redis$ bin/redis-server redis.conf
c80k2@ubuntu:/usr/local/redis$ bin/redis-cli SHUTDOWN

日誌

42661:M 30 May 11:08:57.781 * Saving the final RDB snapshot before exiting.
42661:M 30 May 11:08:57.783 * DB saved on disk
42661:M 30 May 11:08:57.784 * Removing the pid file.
42661:M 30 May 11:08:57.784 # Redis is now ready to exit, bye bye...

進程

c80k2@ubuntu:/usr/local/redis$ ps -aux | grep redis | grep -v grep
c80k2     36437  0.0  0.0  14388   692 pts/29   S+   May29   0:00 tail -f redis.log

解決。

相關文章
相關標籤/搜索