這是今天在測試Redis3.0.0集羣的時候偶然遇到的狀況。在中止Redis服務時,我分別用了pkill redis-server和kill -9 redis-pid的方式中止Redis服務,但Redis的日誌輸出卻不同。redis
使用pkill中止Redis時,輸入的日誌以下。說明Redis是正常退出的。
shell
16017:signal-handler (1423639887) Received SIGTERM scheduling shutdown... 16017:M 10 Feb 23:31:27.163 # User requested shutdown... 16017:M 10 Feb 23:31:27.164 * Calling fsync() on the AOF file. 16017:M 10 Feb 23:31:27.164 * Saving the final RDB snapshot before exiting. 16017:M 10 Feb 23:31:27.213 * DB saved on disk 16017:M 10 Feb 23:31:27.213 # Redis is now ready to exit, bye bye...
而使用kill -9中止Redis時,Redis沒有任何日誌輸出,說明用kill命令中止Redis服務是不對的。session
從上面的日誌也能夠看出,若是要Redis正常退出,須要給Redis發出一個SIGTERM信號。而pkill是將含有參數的全部進程kill掉,若是要kill單個進程,而且發出SIGTERM命令可不能夠呢?答案是能夠的,經過kill -15 redis-pid。
測試
如今總結一下,若是要正常中止Redis服務,能夠經過pkill命令中止全部Redis服務或者使用kill -15 redis-pid中止某一個Redis服務。
spa
下面順便說一下pkill和kill。
日誌
pkill:經過名稱和其它屬性查找或者發信號給進程。
code
kill:能夠經過kill -l命令查看到kill有64個參數,經常使用的5個以下:
orm
1) SIGHUP:本信號在用戶終端鏈接(正常或非正常)結束時發出, 一般是在終端的控制進程結束時, 通知同一session內的各個做業, 這時它們與控制終端再也不關聯。server
2) SIGINT:程序終止(interrupt)信號, 在用戶鍵入INTR字符(一般是Ctrl-C)時發出,用於通知前臺進程組終止進程。進程
3) SIGQUIT:和SIGINT相似, 但由QUIT字符(一般是Ctrl-\)來控制. 進程在因收到SIGQUIT退出時會產生core文件, 在這個意義上相似於一個程序錯誤信號。
9) SIGKILL:用來當即結束程序的運行. 本信號不能被阻塞、處理和忽略。若是管理員發現某個進程終止不了,可嘗試發送這個信號。
15) SIGTERM:程序結束(terminate)信號, 與SIGKILL不一樣的是該信號能夠被阻塞和處理。一般用來要求程序本身正常退出,shell命令kill缺省產生這個信號。若是進程終止不了,咱們纔會嘗試SIGKILL。