啓動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
解決。