PostgreSQL 백그라운드 프로세스 이름 재인식
22033 단어 PostgreSQL
/* 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); ......}
예를 들면 한 아버지가 몇 명의 아들을 두었는데, 어느 날 그가 몇 명의 아들에게 물었다. 너희들은 커서 무엇을 하고 싶니?
맏형은 내가 장군이 되어 나라를 지키고 싶다고 말했다.둘째는 내가 의사가 되어 죽은 사람을 구하고 부상자를 돕고 싶다고 말했다.셋째는 내가 교사가 되고 싶다며 복숭아와 자두가 천하에 가득하다고 말했다.
그러자 아버지는 좋다고 말씀하셨다. 그는 모든 아들에게 장군, 의사, 교사라고 적힌 모자를 만들어 주었다.사람들의 비웃음 속에서 세 아들은 하나는 군대에 갔고, 하나는 의과대학에 갔고, 하나는 사범대학에 갔다.서로 다른 길을 걷다가 정말로 각자의 꿈을 이루었다.
이것이 바로 서로 다른 하위 프로세스가 서로 다른 이름을 가진 유비이다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Redmine 데이터베이스를 MySQL에서 PostgreSQL로 마이그레이션 (보충)Redmine 의 Database 를 MySQL 로 운용하고 있었습니다만, MySQL 5.6 이상이나 MariaDB 에는 , , 이러한 티켓이 수년 동안 방치된 상황을 감안하여, PostgreSQL로 마이그레이션하기...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.