PostgreSQL 백그라운드 프로세스 이름 재인식

22033 단어 PostgreSQL
Postmaster에서 다음과 같은 코드를 보십시오.
 /* StartChildProcess -- start an auxiliary process for the postmaster                            

 *                            

 * xlop determines what kind of child will be started.    All child types                        

 * initially go to AuxiliaryProcessMain, which will handle common setup.                            

 *                            

 * Return value of StartChildProcess is subprocess' PID, or 0 if failed                            

 * to start subprocess.                            

 */                            

static pid_t                            

StartChildProcess(AuxProcType type)                            

{                            

    pid_t    pid;                    

    char    *av[10];                    

    int    ac = 0;                    

    char    typebuf[32];                    

                            

    /*                        

     * Set up command-line arguments for subprocess                        

     */                        

    av[ac++] = "postgres";                        

                            

    #ifdef EXEC_BACKEND                        

        av[ac++] = "--forkboot";                    

        av[ac++] = NULL;            /* filled in by postmaster_forkexec */        

    #endif                        

                            

    snprintf(typebuf, sizeof(typebuf), "-x%d", type);                        

    av[ac++] = typebuf;                        

                            

    av[ac] = NULL;                        

    Assert(ac < lengthof(av));                        

                            

    #ifdef EXEC_BACKEND                        

        pid = postmaster_forkexec(ac, av);                    

                            

    #else    /* !EXEC_BACKEND */                    

                            

        pid = fork_process();                    

                            

        if (pid == 0)        /* child */            

        {                    

            IsUnderPostmaster = true;                /* we are a postmaster subprocess now */

                            

            /* Close the postmaster's sockets */                

            ClosePostmasterPorts(false);                

                            

            /* Lose the postmaster's on-exit routines and port connections */                

            on_exit_reset();                

                            

            /* Release postmaster's working memory context */                

            MemoryContextSwitchTo(TopMemoryContext);                

            MemoryContextDelete(PostmasterContext);                

            PostmasterContext = NULL;                

                            

            AuxiliaryProcessMain(ac, av);                

            ExitPostmaster(0);                

        }                    

    #endif   /* EXEC_BACKEND */                        

                            

    ……

    /*                        

     * in parent, successful fork                        

     */                        

    return pid;                        

} 

AuxiliaryProcessMain은 각 하위 프로세스의 엔트리 포인트입니다.
그렇다면 ps-ef | grep post에서 각 하위 프로세스의 다른 이름을 볼 수 있는 이유는 무엇입니까?
이것은 Auxiliary ProcessMain의 실현과 관련이 있으며, 코드는bootstrap에 있습니다.c에서 다음은 줄여서 내가 관심 있는 코드만 고려한다.
/*                                    

 *     AuxiliaryProcessMain                                

 *                                    

 *     The main entry point for auxiliary processes, such as the bgwriter,                                

 *     walwriter, walreceiver, bootstrapper and the shared memory checker code.                                

 *                                    

 *     This code is here just because of historical reasons.                                

 */                                    

void                                    

AuxiliaryProcessMain(int argc, char *argv[])                                    

{                                    

    ……                                

    /* If no -x argument, we are a CheckerProcess */                                

    MyAuxProcType = CheckerProcess;                                

                                    

    while ((flag = getopt(argc, argv, "B:c:d:D:Fr:x:-:")) != -1)                                

    {                                

        switch (flag)                            

        {                            

            ……                        

            case 'x':                        

                MyAuxProcType = atoi(optarg);                    

                break;                    

            ……                        

        }                            

    }                                

                                    

    ……                                

    /*                                

     * Identify myself via ps                                

     */                                

    if (IsUnderPostmaster)                                

    {                                

        const char *statmsg;                            

                                    

        switch (MyAuxProcType)                            

        {                            

            case StartupProcess:                        

                statmsg = "startup process";                    

                break;                    

            case BgWriterProcess:                        

                statmsg = "writer process";                    

                break;                    

            case CheckpointerProcess:                        

                statmsg = "checkpointer process";                    

                break;                    

            case WalWriterProcess:                        

                statmsg = "wal writer process";                    

                break;                    

            case WalReceiverProcess:                        

                statmsg = "wal receiver process";                    

                break;                    

            default:                        

                statmsg = "??? process";                    

                break;                    

        }                            

        init_ps_display(statmsg, "", "", "");                            

    }                                

                                    

    ……                                

    /*                                

     * XLOG operations                                

     */                                

    SetProcessingMode(NormalProcessing);                                

                                    

    switch (MyAuxProcType)                                

    {                                

        case CheckerProcess:                            

            /* don't set signals, they're useless here */                        

            CheckerModeMain();                        

            proc_exit(1);        /* should never return */                

                                    

        case BootstrapProcess:                            

            bootstrap_signals();                        

            BootStrapXLOG();                        

            BootstrapModeMain();                        

            proc_exit(1);        /* should never return */                

                                    

        case StartupProcess:                            

            /* don't set signals, startup process has its own agenda */                        

            StartupProcessMain();                        

            proc_exit(1);        /* should never return */                

                                    

        case BgWriterProcess:                            

            /* don't set signals, bgwriter has its own agenda */                        

            BackgroundWriterMain();                        

            proc_exit(1);        /* should never return */                

                                    

        case CheckpointerProcess:                            

            /* don't set signals, checkpointer has its own agenda */                        

            CheckpointerMain();                        

            proc_exit(1);        /* should never return */                

                                    

        case WalWriterProcess:                            

            /* don't set signals, walwriter has its own agenda */                        

            InitXLOGAccess();                        

            WalWriterMain();                        

            proc_exit(1);        /* should never return */                

                                    

        case WalReceiverProcess:                            

            /* don't set signals, walreceiver has its own agenda */                        

            WalReceiverMain();                        

            proc_exit(1);        /* should never return */                

                                    

        default:                            

            elog(PANIC, "unrecognized process type: %d", (int) MyAuxProcType);                        

            proc_exit(1);                        

    }                                

}                                    

호출할 때 전달되는 flag에 따라 각 하위 프로세스의 디스플레이 이름을 설정합니다.
주로 이 단락이다.
switch (MyAuxProcType) {   case StartupProcess:     statmsg = "startup process";     break;   case BgWriterProcess:     statmsg = "writer process";     break;   case CheckpointerProcess:     statmsg = "checkpointer process";     break;   case WalWriterProcess:     statmsg = "wal writer process";     break;   case WalReceiverProcess:     statmsg = "wal receiver process";     break;   default:     statmsg = "??? process";     break; }   init_ps_display(statmsg, "", "", "");
여기서 initps_디스플레이가 중요한 역할을 했다.그러나 구체적으로 적절하게 ps를 초래할 때 각기 다른 명칭을 볼 수 있기 때문에 좀 더 지켜봐야 한다.
먼저 하나의 실험을 해 볼 수 있다.
bootstrap의 initps_dispalya(statmsg,"","",""); 완료 후 다음과 같이 덧붙입니다.
   //added by gaojian , sleep 3 minutes   fprintf(stderr,"sleeping...");   sleep(180);
3초 동안 멈추게 하고 이때 ps명령으로 본 다음에 3초 후에 ps명령으로 본 결과는 다음과 같다.
Postgres를 시작합니다. sleeeping을 보십시오.정보를 입력한 후 다음 명령을 실행합니다.
[root@localhost ~]# ps -ef|grep postroot 2928 2906 0 13:42 pts/1 00:00:00 grep post[root@localhost ~]# ps -ef|grep postroot 2953 2932 0 13:42 pts/2 00:00:00 su - postgrespostgres 2954 2953 0 13:42 pts/2 00:00:00 -bashpostgres 2989 2954 0 13:42 pts/2 00:00:00/usr/local/pgsql/bin/postgres -D/usr/local/pgsql/datapostgres 2990 2989 0 13:42 pts/2 00:00:00 postgres: startup process root 2992 2906 0 13:42 pts/1 00:00:00 grep post
postgres: startup 프로세스라는 하위 프로세스가 나타나는 것을 볼 수 있습니다.뒤에 이 진행 과정이 없어졌다.이것은 매우 재미있다.
그리고 몇 초가 지나면 ps 명령으로 보십시오:
[root@localhost ~]# ps -ef|grep postroot 2953 2932 0 13:42 pts/2 00:00:00 su - postgrespostgres 2954 2953 0 13:42 pts/2 00:00:00 -bashpostgres 2989 2954 0 13:42 pts/2 00:00:00/usr/local/pgsql/bin/postgres -D/usr/local/pgsql/datapostgres 3000 2989 0 13:45 ? 00:00:00 postgres: checkpointer process postgres 3001 2989 0 13:45 ? 00:00:00 postgres: writer process postgres 3002 2989 0 13:45 ? 00:00:00 postgres: wal writer process postgres 3003 2989 0 13:45 ? 00:00:00 postgres: autovacuum launcher process postgres 3004 2989 0 13:45 ? 00:00:00 postgres: stats collector process root 3018 2906 0 13:53 pts/1 00:00:00 grep post
--------------------------------------------------------------------------------------------------
이것에 대해 잠시 놓아두다.더 중요한 것은 다음과 같은 코드라고 생각합니다.
switch (MyAuxProcType) {   ......   case BgWriterProcess:   /* don't set signals, bgwriter has its own agenda */   BackgroundWriterMain();   proc_exit(1);       ......} 
예를 들면 한 아버지가 몇 명의 아들을 두었는데, 어느 날 그가 몇 명의 아들에게 물었다. 너희들은 커서 무엇을 하고 싶니?
맏형은 내가 장군이 되어 나라를 지키고 싶다고 말했다.둘째는 내가 의사가 되어 죽은 사람을 구하고 부상자를 돕고 싶다고 말했다.셋째는 내가 교사가 되고 싶다며 복숭아와 자두가 천하에 가득하다고 말했다.
그러자 아버지는 좋다고 말씀하셨다. 그는 모든 아들에게 장군, 의사, 교사라고 적힌 모자를 만들어 주었다.사람들의 비웃음 속에서 세 아들은 하나는 군대에 갔고, 하나는 의과대학에 갔고, 하나는 사범대학에 갔다.서로 다른 길을 걷다가 정말로 각자의 꿈을 이루었다.
이것이 바로 서로 다른 하위 프로세스가 서로 다른 이름을 가진 유비이다.

좋은 웹페이지 즐겨찾기