Postmaster 作为父进程,要对很多子进程进行监控,当遇到各种信号的时候,也要适当地进行传达。


/*                                  * pmdie -- signal handler for processing various postmaster signals.                                  */                                 static void                                 pmdie(SIGNAL_ARGS)                                 {                                     int            save_errno = errno;                                                      PG_SETMASK(&BlockSig);                                                                  ereport(DEBUG2,                                         (errmsg_internal("postmaster received signal %d",                                                  postgres_signal_arg)));                                          switch (postgres_signal_arg)                                 {                                     ……                                 case SIGQUIT:                                                                      /*                                  * Immediate Shutdown:                                  *                                  * abort all children with SIGQUIT and exit without attempt to                                  * properly shut down data base system.                                  */                                 ereport(LOG,                                         (errmsg("received immediate shutdown request")));                         SignalChildren(SIGQUIT);                                 if (StartupPID != 0)                                     signal_child(StartupPID, SIGQUIT);                             if (BgWriterPID != 0)                                     signal_child(BgWriterPID, SIGQUIT);                             if (CheckpointerPID != 0)                                     signal_child(CheckpointerPID, SIGQUIT);                             if (WalWriterPID != 0)                                     signal_child(WalWriterPID, SIGQUIT);                             if (WalReceiverPID != 0)                                     signal_child(WalReceiverPID, SIGQUIT);                             if (AutoVacPID != 0)                                     signal_child(AutoVacPID, SIGQUIT);                             if (PgArchPID != 0)                                     signal_child(PgArchPID, SIGQUIT);                             if (PgStatPID != 0)                                     signal_child(PgStatPID, SIGQUIT);                             ExitPostmaster(0);                                 break;                         }                                                                  PG_SETMASK(&UnBlockSig);                                                                  errno = save_errno;                             }


实验验证:

启动:


[postgres@localhost bin]$ ./postgres -D /usr/local/pgsql/data LOG:  database system was shut down at 2012-10-31 15:19:46 CST LOG:  autovacuum launcher started LOG:  database system is ready to accept connections


发信号:


[postgres@localhost bin]$ ./pg_ctl -D /usr/local/pgsql/data stop -m immediate waiting for server to shut down.... done server stopped [postgres@localhost bin]$


后台出现的信息是:


LOG:  received immediate shutdown request bg_quickdie happend. WARNING:  terminating connection because of crash of another server process DETAIL:  The postmaster has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory. HINT:  In a moment you should be able to reconnect to the database and repeat your command.