mirror of
https://github.com/ZLMediaKit/ZLMediaKit.git
synced 2024-11-22 19:00:01 +08:00
子进程重启失败时,不应通知守护进程退出,确保子进程重启成功
This commit is contained in:
parent
c334dcfd38
commit
e065b1dfba
@ -81,42 +81,45 @@ static void sig_crash(int sig) {
|
|||||||
#endif // !defined(ANDROID) && !defined(_WIN32)
|
#endif // !defined(ANDROID) && !defined(_WIN32)
|
||||||
|
|
||||||
|
|
||||||
void System::startDaemon() {
|
void System::startDaemon(bool &kill_parent_if_failed) {
|
||||||
|
kill_parent_if_failed = true;
|
||||||
#ifndef _WIN32
|
#ifndef _WIN32
|
||||||
static pid_t pid;
|
static pid_t pid;
|
||||||
do{
|
do {
|
||||||
pid = fork();
|
pid = fork();
|
||||||
if(pid == -1){
|
if (pid == -1) {
|
||||||
WarnL << "fork失败:" << get_uv_errmsg();
|
WarnL << "fork失败:" << get_uv_errmsg();
|
||||||
//休眠1秒再试
|
//休眠1秒再试
|
||||||
sleep(1);
|
sleep(1);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(pid == 0){
|
if (pid == 0) {
|
||||||
//子进程
|
//子进程
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
//父进程,监视子进程是否退出
|
//父进程,监视子进程是否退出
|
||||||
DebugL << "启动子进程:" << pid;
|
DebugL << "启动子进程:" << pid;
|
||||||
signal(SIGINT, [](int) {
|
signal(SIGINT, [](int) {
|
||||||
WarnL << "收到主动退出信号,关闭父进程与子进程";
|
WarnL << "收到主动退出信号,关闭父进程与子进程";
|
||||||
kill(pid,SIGINT);
|
kill(pid, SIGINT);
|
||||||
exit(0);
|
exit(0);
|
||||||
});
|
});
|
||||||
|
|
||||||
do{
|
do {
|
||||||
int status = 0;
|
int status = 0;
|
||||||
if(waitpid(pid, &status, 0) >= 0) {
|
if (waitpid(pid, &status, 0) >= 0) {
|
||||||
WarnL << "子进程退出";
|
WarnL << "子进程退出";
|
||||||
//休眠3秒再启动子进程
|
//休眠3秒再启动子进程
|
||||||
sleep(3);
|
sleep(3);
|
||||||
|
//重启子进程,如果子进程重启失败,那么不应该杀掉守护进程,这样守护进程可以一直尝试重启子进程
|
||||||
|
kill_parent_if_failed = false;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
DebugL << "waitpid被中断:" << get_uv_errmsg();
|
DebugL << "waitpid被中断:" << get_uv_errmsg();
|
||||||
}while (true);
|
} while (true);
|
||||||
}while (true);
|
} while (true);
|
||||||
#endif // _WIN32
|
#endif // _WIN32
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -16,7 +16,7 @@
|
|||||||
class System {
|
class System {
|
||||||
public:
|
public:
|
||||||
static std::string execute(const std::string &cmd);
|
static std::string execute(const std::string &cmd);
|
||||||
static void startDaemon();
|
static void startDaemon(bool &kill_parent_if_failed);
|
||||||
static void systemSetup();
|
static void systemSetup();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -206,9 +206,10 @@ int start_main(int argc,char *argv[]) {
|
|||||||
|
|
||||||
#if !defined(_WIN32)
|
#if !defined(_WIN32)
|
||||||
pid_t pid = getpid();
|
pid_t pid = getpid();
|
||||||
|
bool kill_parent_if_failed = true;
|
||||||
if (bDaemon) {
|
if (bDaemon) {
|
||||||
//启动守护进程
|
//启动守护进程
|
||||||
System::startDaemon();
|
System::startDaemon(kill_parent_if_failed);
|
||||||
}
|
}
|
||||||
//开启崩溃捕获等
|
//开启崩溃捕获等
|
||||||
System::systemSetup();
|
System::systemSetup();
|
||||||
@ -317,7 +318,8 @@ int start_main(int argc,char *argv[]) {
|
|||||||
ErrorL << "程序启动失败,请修改配置文件中端口号后重试!" << endl;
|
ErrorL << "程序启动失败,请修改配置文件中端口号后重试!" << endl;
|
||||||
sleep(1);
|
sleep(1);
|
||||||
#if !defined(_WIN32)
|
#if !defined(_WIN32)
|
||||||
if (pid != getpid()) {
|
if (pid != getpid() && kill_parent_if_failed) {
|
||||||
|
//杀掉守护进程
|
||||||
kill(pid, SIGINT);
|
kill(pid, SIGINT);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user