標籤:
這是今天在測試Redis3.0.0叢集的時候偶然遇到的情況。在停止Redis服務時,我分別用了pkill redis-server和kill -9 redis-pid的方式停止Redis服務,但Redis的日誌輸出卻不一樣。
使用pkill停止Redis時,輸入的日誌如下。說明Redis是正常退出的。
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 disk16017:M 10 Feb 23:31:27.213 # Redis is now ready to exit, bye bye...
而使用kill -9停止Redis時,Redis沒有任何日誌輸出,說明用kill命令停止Redis服務是不對的。
從上面的日誌也可以看出,如果要Redis正常退出,需要給Redis發出一個SIGTERM訊號。而pkill是將含有參數的所有進程kill掉,如果要kill單個進程,並且發出SIGTERM命令可不可以呢?答案是可以的,通過kill -15 redis-pid。
現在總結一下,如果要正常停止Redis服務,可以通過pkill命令停止所有Redis服務或者使用kill -15 redis-pid停止某一個Redis服務。
下面順便說一下pkill和kill。
pkill:通過名稱和其它屬性尋找或者發訊號給進程。
kill:可以通過kill -l命令查看到kill有64個參數,常用的5個如下:
1) SIGHUP:本訊號在使用者終端串連(正常或非正常)結束時發出, 通常是在終端的控制進程結束時, 通知同一session內的各個作業, 這時它們與控制終端不再關聯。
2) SIGINT:程式終止(interrupt)訊號, 在使用者鍵入INTR字元(通常是Ctrl-C)時發出,用於通知前台進程組終止進程。
3) SIGQUIT:和SIGINT類似, 但由QUIT字元(通常是Ctrl-\)來控制. 進程在因收到SIGQUIT退出時會產生core檔案, 在這個意義上類似於一個程式錯誤訊號。
9) SIGKILL:用來立即結束程式的運行. 本訊號不能被阻塞、處理和忽略。如果管理員發現某個進程終止不了,可嘗試發送這個訊號。
15) SIGTERM:程式結束(terminate)訊號, 與SIGKILL不同的是該訊號可以被阻塞和處理。通常用來要求程式自己正常退出,shell命令kill預設產生這個訊號。如果進程終止不了,我們才會嘗試SIGKILL。
redis sigterm 訊號