修复IP位置显示
This commit is contained in:
81
main.go
81
main.go
@@ -238,34 +238,73 @@ func main() {
|
||||
|
||||
// daemonize 创建守护进程
|
||||
func daemonize() error {
|
||||
// 使用更简单的方式创建守护进程:直接在当前进程中进行守护化处理
|
||||
// 1. 重定向标准输入、输出、错误
|
||||
// 1. 第一次fork,创建子进程,父进程退出
|
||||
pid, err := syscall.Fork()
|
||||
if err != nil {
|
||||
return fmt.Errorf("第一次fork失败: %w", err)
|
||||
}
|
||||
if pid > 0 {
|
||||
// 父进程退出
|
||||
os.Exit(0)
|
||||
}
|
||||
|
||||
// 2. 设置文件权限掩码
|
||||
syscall.Umask(0)
|
||||
|
||||
// 3. 创建新会话
|
||||
_, err = syscall.Setsid()
|
||||
if err != nil {
|
||||
return fmt.Errorf("创建新会话失败: %w", err)
|
||||
}
|
||||
|
||||
// 4. 第二次fork,确保进程不是会话组长,避免获取控制终端
|
||||
pid, err = syscall.Fork()
|
||||
if err != nil {
|
||||
return fmt.Errorf("第二次fork失败: %w", err)
|
||||
}
|
||||
if pid > 0 {
|
||||
// 父进程退出
|
||||
os.Exit(0)
|
||||
}
|
||||
|
||||
// 5. 切换工作目录到根目录
|
||||
err = syscall.Chdir("/")
|
||||
if err != nil {
|
||||
return fmt.Errorf("切换工作目录失败: %w", err)
|
||||
}
|
||||
|
||||
// 6. 关闭所有打开的文件描述符
|
||||
for fd := 0; fd < 1024; fd++ {
|
||||
syscall.Close(fd)
|
||||
}
|
||||
|
||||
// 7. 重定向标准输入、输出、错误到/dev/null
|
||||
nullFile, err := os.OpenFile("/dev/null", os.O_RDWR, 0)
|
||||
if err != nil {
|
||||
return fmt.Errorf("打开/dev/null失败: %w", err)
|
||||
}
|
||||
defer nullFile.Close()
|
||||
|
||||
// 重定向文件描述符
|
||||
err = syscall.Dup2(int(nullFile.Fd()), int(os.Stdin.Fd()))
|
||||
if err != nil {
|
||||
return fmt.Errorf("重定向stdin失败: %w", err)
|
||||
}
|
||||
err = syscall.Dup2(int(nullFile.Fd()), int(os.Stdout.Fd()))
|
||||
if err != nil {
|
||||
return fmt.Errorf("重定向stdout失败: %w", err)
|
||||
}
|
||||
err = syscall.Dup2(int(nullFile.Fd()), int(os.Stderr.Fd()))
|
||||
if err != nil {
|
||||
return fmt.Errorf("重定向stderr失败: %w", err)
|
||||
}
|
||||
// 重定向标准输入、输出、错误
|
||||
syscall.Dup2(int(nullFile.Fd()), 0) // stdin
|
||||
syscall.Dup2(int(nullFile.Fd()), 1) // stdout
|
||||
syscall.Dup2(int(nullFile.Fd()), 2) // stderr
|
||||
|
||||
// 2. 创建新的会话和进程组
|
||||
_, err = syscall.Setsid()
|
||||
if err != nil {
|
||||
return fmt.Errorf("创建新会话失败: %w", err)
|
||||
}
|
||||
// 8. 处理SIGCHLD信号,避免产生僵尸进程
|
||||
syscall.Signal(syscall.SIGCHLD, syscall.SIG_IGN)
|
||||
|
||||
// 9. 写入PID文件
|
||||
pid = syscall.Getpid()
|
||||
pidFile, err := os.OpenFile("/var/run/dns-server.pid", os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0644)
|
||||
if err != nil {
|
||||
return fmt.Errorf("打开PID文件失败: %w", err)
|
||||
}
|
||||
_, err = fmt.Fprintf(pidFile, "%d\n", pid)
|
||||
if err != nil {
|
||||
pidFile.Close()
|
||||
return fmt.Errorf("写入PID文件失败: %w", err)
|
||||
}
|
||||
pidFile.Close()
|
||||
|
||||
fmt.Println("守护进程已启动")
|
||||
return nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user