溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

MYSQL中對(duì)信號(hào)的處理(SIGTERM,SIGQUIT,SIGHUP等)

發(fā)布時(shí)間:2020-08-15 17:17:21 來(lái)源:ITPUB博客 閱讀:292 作者:gaopengtttt 欄目:MySQL數(shù)據(jù)庫(kù)
原創(chuàng),因?yàn)長(zhǎng)INUX系統(tǒng)編程水平有限某些用詞不當(dāng)請(qǐng)指出

一、信號(hào)處理以及多線程先信號(hào)處理基礎(chǔ)知識(shí)
在LINUX中信號(hào)是一種由內(nèi)核處理的一種軟中斷機(jī)制,他滿足簡(jiǎn)單、不能攜帶大量信息、并且要滿足一定條件才會(huì)發(fā)送等特征。
信號(hào)會(huì)經(jīng)歷產(chǎn)生-->阻塞信號(hào)集-->未決信號(hào)集-->信號(hào)遞達(dá)-->信號(hào)處理方式
首先信號(hào)的產(chǎn)生可以有多種方式比如我們經(jīng)常用的kill命名,下面將一些kill 中常用信號(hào)列舉一下并且給出默認(rèn)處理方式
(摘取自邢文鵬LINUX講義)

點(diǎn)擊(此處)折疊或打開(kāi)

  1. 1) SIGHUP:當(dāng)用戶退出shell時(shí),由該shell啟動(dòng)的所有進(jìn)程將收到這個(gè)信號(hào),默認(rèn)動(dòng)作為終止進(jìn)程
  2. 2)SIGINT:當(dāng)用戶按下了<Ctrl+C>組合鍵時(shí),用戶終端向正在運(yùn)行中的由該終端啟動(dòng)的程序發(fā)出此信號(hào)。默認(rèn)動(dòng)
  3. 作為終止里程。
  4. 3)SIGQUIT:當(dāng)用戶按下<ctrl+\>組合鍵時(shí)產(chǎn)生該信號(hào),用戶終端向正在運(yùn)行中的由該終端啟動(dòng)的程序發(fā)出些信
  5. 號(hào)。默認(rèn)動(dòng)作為終止進(jìn)程。
  6. 4)SIGILL:CPU檢測(cè)到某進(jìn)程執(zhí)行了非法指令。默認(rèn)動(dòng)作為終止進(jìn)程并產(chǎn)生core文件
  7. 5)SIGTRAP:該信號(hào)由斷點(diǎn)指令或其他 trap指令產(chǎn)生。默認(rèn)動(dòng)作為終止里程 并產(chǎn)生core文件。
  8. 6 ) SIGABRT:調(diào)用abort函數(shù)時(shí)產(chǎn)生該信號(hào)。默認(rèn)動(dòng)作為終止進(jìn)程并產(chǎn)生core文件。
  9. 7)SIGBUS:非法訪問(wèn)內(nèi)存地址,包括內(nèi)存對(duì)齊出錯(cuò),默認(rèn)動(dòng)作為終止進(jìn)程并產(chǎn)生core文件。
  10. 8)SIGFPE:在發(fā)生致命的運(yùn)算錯(cuò)誤時(shí)發(fā)出。不僅包括浮點(diǎn)運(yùn)算錯(cuò)誤,還包括溢出及除數(shù)為0等所有的算法錯(cuò)誤。默
  11. 認(rèn)動(dòng)作為終止進(jìn)程并產(chǎn)生core文件。
  12. 9)SIGKILL:無(wú)條件終止進(jìn)程。本信號(hào)不能被忽略,處理和阻塞。默認(rèn)動(dòng)作為終止進(jìn)程。它向系統(tǒng)管理員提供了可
  13. 以殺死任何進(jìn)程的方法。
  14. 10)SIGUSE1:用戶定義 的信號(hào)。即程序員可以在程序中定義并使用該信號(hào)。默認(rèn)動(dòng)作為終止進(jìn)程。
  15. 11)SIGSEGV:指示進(jìn)程進(jìn)行了無(wú)效內(nèi)存訪問(wèn)。默認(rèn)動(dòng)作為終止進(jìn)程并產(chǎn)生core文件。
  16. 12)SIGUSR2:這是另外一個(gè)用戶自定義信號(hào) ,程序員可以在程序中定義 并使用該信號(hào)。默認(rèn)動(dòng)作為終止進(jìn)程。1
  17. 13)SIGPIPE:Broken pipe向一個(gè)沒(méi)有讀端的管道寫數(shù)據(jù)。默認(rèn)動(dòng)作為終止進(jìn)程。
  18. 14) SIGALRM:定時(shí)器超時(shí),超時(shí)的時(shí)間 由系統(tǒng)調(diào)用alarm設(shè)置。默認(rèn)動(dòng)作為終止進(jìn)程。
  19. 15)SIGTERM:程序結(jié)束信號(hào),與SIGKILL不同的是,該信號(hào)可以被阻塞和終止。通常用來(lái)要示程序正常退出。執(zhí)行
  20. shell命令Kill時(shí),缺省產(chǎn)生這個(gè)信號(hào)。默認(rèn)動(dòng)作為終止進(jìn)程。
  21. 16)SIGCHLD:子進(jìn)程結(jié)束時(shí),父進(jìn)程會(huì)收到這個(gè)信號(hào)。默認(rèn)動(dòng)作為忽略這個(gè)信號(hào)。
  22. 17)SIGCONT:停止進(jìn)程的執(zhí)行。信號(hào)不能被忽略,處理和阻塞。默認(rèn)動(dòng)作為終止進(jìn)程。
  23. 18)SIGTTIN:后臺(tái)進(jìn)程讀終端控制臺(tái)。默認(rèn)動(dòng)作為暫停進(jìn)程。
  24. 19)SIGTSTP:停止進(jìn)程的運(yùn)行。按下<ctrl+z>組合鍵時(shí)發(fā)出這個(gè)信號(hào)。默認(rèn)動(dòng)作為暫停進(jìn)程。
  25. 21)SIGTTOU:該信號(hào)類似于SIGTTIN,在后臺(tái)進(jìn)程要向終端輸出數(shù)據(jù)時(shí)發(fā)生。默認(rèn)動(dòng)作為暫停進(jìn)程。
  26. 22)SIGURG:套接字上有緊急數(shù)據(jù)時(shí),向當(dāng)前正在運(yùn)行的進(jìn)程發(fā)出些信號(hào),報(bào)告有緊急數(shù)據(jù)到達(dá)。如網(wǎng)絡(luò)帶外數(shù)據(jù)
  27. 到達(dá),默認(rèn)動(dòng)作為忽略該信號(hào)。
  28. 23)SIGXFSZ:進(jìn)程執(zhí)行時(shí)間超過(guò)了分配給該進(jìn)程的CPU時(shí)間 ,系統(tǒng)產(chǎn)生該信號(hào)并發(fā)送給該進(jìn)程。默認(rèn)動(dòng)作為終止
  29. 進(jìn)程。
  30. 24)SIGXFSZ:超過(guò)文件的最大長(zhǎng)度設(shè)置。默認(rèn)動(dòng)作為終止進(jìn)程。
  31. 25)SIGVTALRM:虛擬時(shí)鐘超時(shí)時(shí)產(chǎn)生該信號(hào)。類似于SIGALRM,但是該信號(hào)只計(jì)算該進(jìn)程占用CPU的使用時(shí)間。默
  32. 認(rèn)動(dòng)作為終止進(jìn)程。
  33. 26)SGIPROF:類似于SIGVTALRM,它不公包括該進(jìn)程占用CPU時(shí)間還包括執(zhí)行系統(tǒng)調(diào)用時(shí)間。默認(rèn)動(dòng)作為終止進(jìn)
  34. 程。
  35. 27)SIGWINCH:窗口變化大小時(shí)發(fā)出。默認(rèn)動(dòng)作為忽略該信號(hào)。
  36. 28)SIGIO:此信號(hào)向進(jìn)程指示發(fā)出了一個(gè)異步IO事件。默認(rèn)動(dòng)作為忽略。
  37. 29)SIGPWR:關(guān)機(jī)。默認(rèn)動(dòng)作為終止進(jìn)程。
  38. 30)SIGSYS:無(wú)效的系統(tǒng)調(diào)用。默認(rèn)動(dòng)作為終止進(jìn)程并產(chǎn)生core文件。
  39. 31)SIGRTMIN~(64)SIGRTMAX:LINUX的實(shí)時(shí)信號(hào),它們沒(méi)有固定的含義(可以由用戶自定義)。所有的實(shí)時(shí)信
  40. 號(hào)的默認(rèn)動(dòng)作都為終止進(jìn)程
其次我們經(jīng)常的按鍵也可以產(chǎn)生
Ctrl+c 2)SIGINT
Ctrl+\ 3)SIGQUIT
Ctrl+z 4)SIGTSTP
當(dāng)然還有很多其他觸發(fā)方式比如硬件異常,raise函數(shù),abort函數(shù),alarm函數(shù)等等。
其次是阻塞信號(hào)集,阻塞信號(hào)集能夠?qū)ο氤?9/19號(hào)信號(hào)以外)的信號(hào)進(jìn)行屏蔽,如果屏蔽后信號(hào)自然不會(huì)到達(dá)遞達(dá)狀態(tài),也就談不上
處理了。我們通過(guò)sigprocmask函數(shù)進(jìn)行阻塞信號(hào)集的設(shè)置,但之前必須要設(shè)置sigset_t 集合,通過(guò)sigaddset sigdelset sigemptyset
sigfillset等函數(shù)設(shè)置。

未決信號(hào)集是不能被操作的,只能被獲取通過(guò)sigpending函數(shù)獲取,但是他和阻塞信號(hào)集一起可以控制信號(hào)的遞達(dá)

信號(hào)遞達(dá)后就需要處理信號(hào),默認(rèn)的行為上面都列舉了,但是信號(hào)(9/19號(hào)信號(hào)以外)是可以被捕獲改變其處理方式的,我們可以自定義函數(shù)
作為某個(gè)信號(hào)的處理方式,這可以通過(guò)signal函數(shù)和sigaction函數(shù)進(jìn)行捕獲和處理,sigaction函數(shù)相對(duì)復(fù)雜需要有一個(gè)struct sigaction的
結(jié)構(gòu)體變量,其中包含了sa_handler\sa_mask\sa_flags\sa_siaction 成員,這里不做解釋可以自行查看LINUX man page

上面是單進(jìn)程下的信號(hào)處理方式,在多線程下,線程之間公用處理方式,但是可以有不同的信號(hào)屏蔽集,在多線程下一般采用設(shè)置統(tǒng)一的信號(hào)
屏蔽字和信號(hào)處理方式使用pthread_mask函數(shù)繼承到各個(gè)線程,同時(shí)使用sigwait/sigwaitinfo等函數(shù)設(shè)置一個(gè)單獨(dú)的信號(hào)處理線程來(lái)進(jìn)行統(tǒng)一
處理,MYSQL就是這樣處理的。

二、MYSQL中的信號(hào)處理
首先我們可以發(fā)現(xiàn)MYSQL中有一個(gè)單獨(dú)的signal處理線程
|     36 |         1927 | sql/signal_handler              |    NULL | BACKGROUND | NULL   | NULL         |
這個(gè)線程對(duì)整個(gè)MYSQLD進(jìn)程的信號(hào)進(jìn)行統(tǒng)一的處理,特別是涉及到SIGTERM,SIGQUIT,SIGHUP等信號(hào)的處理。
下面從源碼觸發(fā)我們來(lái)分析一下
1、信號(hào)初始化
void my_init_signals()函數(shù)
下面我們將一些關(guān)于信號(hào)處理的源碼放出來(lái)進(jìn)行解釋

點(diǎn)擊(此處)折疊或打開(kāi)

  1. /*
  2.       SA_RESETHAND resets handler action to default when entering handler.
  3.       SA_NODEFER allows receiving the same signal during handler.
  4.       E.g. SIGABRT during our signal handler will dump core (default action).
  5.     */
  6.     //這里將一些列如段錯(cuò)誤、浮點(diǎn)數(shù)例外、總線錯(cuò)誤、CPU非法指令等信號(hào)的默認(rèn)處理
  7.     //方式進(jìn)行修改,修改為handle_fatal_signal函數(shù)調(diào)用,這個(gè)函數(shù)應(yīng)該是打印一些
  8.     //出錯(cuò)時(shí)候的狀態(tài)信息等,我沒(méi)有仔細(xì)看這個(gè)回調(diào)函數(shù)
  9.     sa.sa_flags= SA_RESETHAND | SA_NODEFER;
  10.     sa.sa_handler= handle_fatal_signal;
  11.     // Treat all these as fatal and handle them.
  12.     (void) sigaction(SIGSEGV, &sa, NULL);
  13.     (void) sigaction(SIGABRT, &sa, NULL);
  14.     (void) sigaction(SIGBUS, &sa, NULL);
  15.     (void) sigaction(SIGILL, &sa, NULL);
  16.     (void) sigaction(SIGFPE, &sa, NULL);
  17.   }
  18.   
  19.   // Ignore SIGPIPE and SIGALRM
  20.   //這里忽略掉管道錯(cuò)誤和定時(shí)器信號(hào)
  21.   sa.sa_flags= 0;
  22.   sa.sa_handler= SIG_IGN;
  23.   (void) sigaction(SIGPIPE, &sa, NULL);
  24.   (void) sigaction(SIGALRM, &sa, NULL);
  25.    
  26.   //自定義信號(hào),從注釋來(lái)看是終止socket通信的
  27.   //回調(diào)函數(shù)為empty_signal_handler
  28.   // SIGUSR1 is used to interrupt the socket listener.
  29.   sa.sa_handler= empty_signal_handler;
  30.   (void) sigaction(SIGUSR1, &sa, NULL);
  31.   
  32.   
  33.   //這里估計(jì)是什么特殊處理因?yàn)镾IGTERM、SIGHUP已經(jīng)在后面設(shè)置了
  34.   //阻塞,應(yīng)該和平臺(tái)有關(guān)
  35.   // Fix signals if ignored by parents (can happen on Mac OS X).
  36.   sa.sa_handler= SIG_DFL;
  37.   (void) sigaction(SIGTERM, &sa, NULL);
  38.   (void) sigaction(SIGHUP, &sa, NULL);
  39.   
  40.   //下面開(kāi)始設(shè)置我們的阻塞信號(hào)集通過(guò)pthread_sigmask生效
  41.   //要阻塞SIGQUIT、SIGHUP、SIGTERM、SIGTSTP等信號(hào)
  42.   //都是一些常用的可以終止進(jìn)程的信號(hào)
  43.   sigset_t set;
  44.   (void) sigemptyset(&set);
  45.   /*
  46.     Block SIGQUIT, SIGHUP and SIGTERM.
  47.     The signal handler thread does sigwait() on these.
  48.   */
  49.   (void) sigaddset(&set, SIGQUIT);
  50.   (void) sigaddset(&set, SIGHUP);
  51.   (void) sigaddset(&set, SIGTERM);
  52.   (void) sigaddset(&set, SIGTSTP);
  53.   /*
  54.     Block SIGINT unless debugging to prevent Ctrl+C from causing
  55.     unclean shutdown of the server.
  56.   */
  57.   if (!(test_flags & TEST_SIGINT))
  58.     (void) sigaddset(&set, SIGINT);
  59.   pthread_sigmask(SIG_SETMASK, &set, NULL);

 到這里我們發(fā)現(xiàn)MYSQL線程實(shí)際上屏蔽了SIGQUIT、SIGHUP、SIGTERM、SIGTSTP
 信號(hào),通過(guò)一個(gè)專門的線程來(lái)處理這幾個(gè)信號(hào)。同時(shí)很多信號(hào)也重新捕獲改變了其
處理方式,詳見(jiàn)上面解釋。
2、信號(hào)處理線程
start_signal_handler-->signal_hand 來(lái)建立信號(hào)處理線程。
我們重點(diǎn)關(guān)注signal_hand這個(gè)回調(diào)函數(shù),下面是一些源碼和解釋

點(diǎn)擊(此處)折疊或打開(kāi)

  1. extern "C" void *signal_hand(void *arg MY_ATTRIBUTE((unused)))
  2. {
  3.   my_thread_init();
  4. //這里設(shè)置sigset_t信號(hào)集合,并將SIGTERM/SIGQUIT/SIGHUP設(shè)置
  5.   sigset_t set;
  6.   (void) sigemptyset(&set);
  7.   (void) sigaddset(&set, SIGTERM);
  8.   (void) sigaddset(&set, SIGQUIT);
  9.   (void) sigaddset(&set, SIGHUP);

  10. .....MUTEX相關(guān)不考慮

  11.   for (;;)
  12.   {
  13.     int sig;
  14.     while (sigwait(&set, &sig) == EINTR) //調(diào)用sigwait堵塞捕獲信號(hào)
  15.     {}
  16.     if (cleanup_done)
  17.     {
  18.       my_thread_end();
  19.       my_thread_exit(0); // Safety
  20.       return NULL; // Avoid compiler warnings
  21.     }
  22.     switch (sig) { //下面的判斷非常重要如果是SIGTERM和SIGQUIT會(huì)
  23.                      //pthread_kill終止所有活動(dòng)的會(huì)話線程每個(gè)線程將收到
  24.                      //SIGUSR1信號(hào)然后調(diào)用empty_signal_handler回調(diào)函數(shù)進(jìn)行
  25.                      //處理然后close_connections然后my_thread_end關(guān)閉,
  26.                      //這里是否調(diào)用innodb關(guān)閉操作,可以通過(guò)GDB打斷點(diǎn)
  27.                      //到innobase_shutdown_for_mysql函數(shù)上,我做了
  28.                      //測(cè)試確實(shí)調(diào)用了后面會(huì)給出,也就是說(shuō)kill SIGTERM和
  29.                      //SIGQUIT是安全的,因?yàn)樗麄冋{(diào)用innodb關(guān)閉函數(shù)正常
  30.                      //的關(guān)閉了innodb
  31.     case SIGTERM:
  32.     case SIGQUIT:
  33.       // Switch to the file log message processing.
  34.       query_logger.set_handlers((log_output_options != LOG_NONE) ?
  35.                                 LOG_FILE : LOG_NONE);
  36.       DBUG_PRINT("info", ("Got signal: %d abort_loop: %d", sig, abort_loop));
  37.       if (!abort_loop)
  38.       {
  39.         abort_loop= true; // Mark abort for threads.
  40.         /*
  41.           Kill the socket listener.
  42.           The main thread will then set socket_listener_active= false,
  43.           and wait for us to finish all the cleanup below.
  44.         */
  45.         mysql_mutex_lock(&LOCK_socket_listener_active);
  46.         while (socket_listener_active)
  47.         {
  48.           DBUG_PRINT("info",("Killing socket listener"));
  49.           if (pthread_kill(main_thread_id, SIGUSR1))
  50.           {
  51.             DBUG_ASSERT(false);
  52.             break;
  53.           }
  54.           mysql_cond_wait(&COND_socket_listener_active,
  55.                           &LOCK_socket_listener_active);
  56.         }
  57.         mysql_mutex_unlock(&LOCK_socket_listener_active);

  58.         close_connections();
  59.       }
  60.       my_thread_end();
  61.       my_thread_exit(0);
  62.       return NULL; // Avoid compiler warnings
  63.       break;
  64.     case SIGHUP: //這里也是大家很關(guān)心的關(guān)于SIGHUP到底了做了什么
  65.                  //我們可以看到他調(diào)用reload_acl_and_cache來(lái)刷新
  66.                  //一個(gè)東西,具體后面給出,并沒(méi)有其他什么操作
  67.                  //這個(gè)SIGHUP信號(hào)的行為完全被改變了
  68.       if (!abort_loop)
  69.       {
  70.         int not_used;
  71.         mysql_print_status(); // Print some debug info
  72.         reload_acl_and_cache(NULL,
  73.                              (REFRESH_LOG | REFRESH_TABLES | REFRESH_FAST |
  74.                               REFRESH_GRANT | REFRESH_THREADS | REFRESH_HOSTS),
  75.                              NULL, &not_used); // Flush logs
  76.         // Reenable query logs after the options were reloaded.
  77.         query_logger.set_handlers(log_output_options);
  78.       }
  79.       break;
  80.     default:
  81.       break; /* purecov: tested */
  82.     }
  83.   }
  84.   return NULL; /* purecov: deadcode */
  85. }

這里我們看到很多我們關(guān)心的東西:
kill/kill -15/kill -SIGTERM做什么:
他們都是一樣的都是SIGTERM信號(hào)MYSQL關(guān)閉所有活躍的連接同時(shí)干凈的關(guān)閉innodb,我通過(guò)gdb確實(shí)看到了innodb關(guān)閉函數(shù)的調(diào)用,
這很容易我只要斷點(diǎn)打到innobase_shutdown_for_mysql(),同時(shí)kill mysqldpid即可

點(diǎn)擊(此處)折疊或打開(kāi)

  1. (gdb) bt
  2. #0 innobase_shutdown_for_mysql () at /root/mysql5.7.14/percona-server-5.7.14-7/storage/innobase/srv/srv0start.cc:2785
  3. #1 0x00000000019a0f9c in innobase_end (hton=0x2e9a450, type=HA_PANIC_CLOSE) at /root/mysql5.7.14/percona-server-5.7.14-7/storage/innobase/handler/ha_innodb.cc:4360
  4. #2 0x0000000000f62215 in ha_finalize_handlerton (plugin=0x2fe31a0) at /root/mysql5.7.14/percona-server-5.7.14-7/sql/handler.cc:813
  5. #3 0x00000000015d3179 in plugin_deinitialize (plugin=0x2fe31a0, ref_check=true) at /root/mysql5.7.14/percona-server-5.7.14-7/sql/sql_plugin.cc:995
  6. #4 0x00000000015d3562 in reap_plugins () at /root/mysql5.7.14/percona-server-5.7.14-7/sql/sql_plugin.cc:1077
  7. #5 0x00000000015d54c7 in plugin_shutdown () at /root/mysql5.7.14/percona-server-5.7.14-7/sql/sql_plugin.cc:1845
  8. #6 0x0000000000ebf5eb in clean_up (print_message=true) at /root/mysql5.7.14/percona-server-5.7.14-7/sql/mysqld.cc:1336
  9. #7 0x0000000000ec6c7e in mysqld_main (argc=56, argv=0x2e98768) at /root/mysql5.7.14/percona-server-5.7.14-7/sql/mysqld.cc:5358
  10. #8 0x0000000000ebd404 in main (argc=9, argv=0x7fffffffe418) at /root/mysql5.7.14/percona-server-5.7.14-7/sql/main.cc:25
kill -3/kill -SIGQUIT做什么:
和上面一樣,這在源碼中清楚的看到了

kill -1/kill -SIGHUP做什么:
源碼解釋中說(shuō)了做
reload_acl_and_cache(NULL,(REFRESH_LOG | REFRESH_TABLES | REFRESH_FAST |
                              REFRESH_GRANT | REFRESH_THREADS | REFRESH_HOSTS),
                             NULL, ?_used); // Flush logs
函數(shù)調(diào)用關(guān)于參數(shù)2
@param options What should be reset/reloaded (tables, privileges, slave...)
我們可以看到這樣的解釋,那么               
REFRESH_LOG | REFRESH_TABLES | REFRESH_FAST |REFRESH_GRANT | REFRESH_THREADS | REFRESH_HOSTS
代表什么,明顯他們是位圖方式,他們代表的東西在源碼中有解釋如下:

點(diǎn)擊(此處)折疊或打開(kāi)

  1. #define REFRESH_GRANT        1    /* Refresh grant tables */
  2. #define REFRESH_LOG        2    /* Start on new log file */
  3. #define REFRESH_TABLES        4    /* close all tables */
  4. #define REFRESH_HOSTS        8    /* Flush host cache */
  5. #define REFRESH_STATUS        16    /* Flush status variables */
  6. #define REFRESH_THREADS        32    /* Flush thread cache */
  7. #define REFRESH_SLAVE 64 /* Reset master info and restart slave
  8.                      thread */
  9. #define REFRESH_MASTER 128 /* Remove all bin logs in the index
  10.                      and truncate the index */
  11. #define REFRESH_ERROR_LOG 256 /* Rotate only the erorr log */
  12. #define REFRESH_ENGINE_LOG 512 /* Flush all storage engine logs */
  13. #define REFRESH_BINARY_LOG 1024 /* Flush the binary log */
  14. #define REFRESH_RELAY_LOG 2048 /* Flush the relay log */
  15. #define REFRESH_GENERAL_LOG 4096 /* Flush the general log */
  16. #define REFRESH_SLOW_LOG 8192 /* Flush the slow query log */
他們基本都是自解釋的,不用過(guò)多描述,那么我們也清楚的明白了SIGHUP在mysqld中被從新定義了,做各種刷新操作而已。

當(dāng)然大家千萬(wàn)不要直接kill -9這個(gè)信號(hào)不能被屏蔽也不能被捕獲,而是強(qiáng)制終止進(jìn)程這個(gè)時(shí)候innodb不可能調(diào)用
innobase_shutdown_for_mysql來(lái)干凈的關(guān)閉MYSQLD。


作者微信:

MYSQL中對(duì)信號(hào)的處理(SIGTERM,SIGQUIT,SIGHUP等)




向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI