{"record":{"id":"e83c3c1384a91622","repo":"AdguardTeam/AdGuardHome","slug":"starting-dnssvc-w","errorCode":null,"errorMessage":"starting dnssvc: %w","messagePattern":"starting dnssvc: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/next/cmd/service.go","lineNumber":76,"sourceCode":"var _ service.Interface = (*serviceMgr)(nil)\n\n// Start implements the [service.Interface] interface for *serviceMgr.\nfunc (s *serviceMgr) Start(ctx context.Context) (err error) {\n\ts.writePID(ctx)\n\n\ts.confMgrMu.RLock()\n\tdefer s.confMgrMu.RUnlock()\n\n\tvar errs []error\n\n\terr = s.confMgr.Web().Start(ctx)\n\tif err != nil {\n\t\terrs = append(errs, fmt.Errorf(\"starting web: %w\", err))\n\t}\n\n\terr = s.confMgr.DNS().Start(ctx)\n\tif err != nil {\n\t\terrs = append(errs, fmt.Errorf(\"starting dnssvc: %w\", err))\n\t}\n\n\treturn errors.Join(errs...)\n}\n\n// writePID writes the PID to the file.  Any errors are reported to log.\nfunc (s *serviceMgr) writePID(ctx context.Context) {\n\tif s.pidFilePath == \"\" {\n\t\treturn\n\t}\n\n\tpid := os.Getpid()\n\tdata := strconv.AppendInt(nil, int64(pid), 10)\n\tdata = append(data, '\\n')\n\n\terr := maybe.WriteFile(s.pidFilePath, data, 0o644)\n\tif err != nil {\n\t\ts.logger.ErrorContext(ctx, \"writing pidfile\", slogutil.KeyError, err)","sourceCodeStart":58,"sourceCodeEnd":94,"githubUrl":"https://github.com/AdguardTeam/AdGuardHome/blob/b41aefbe51c8dde65e2c50f093996afa0502edf9/internal/next/cmd/service.go#L58-L94","documentation":"Failed to start the DNS server component during service start; joined with any web-start error via errors.Join.","triggerScenarios":"confMgr.DNS().Start(ctx) errors: UDP/TCP port 53 in use, missing permission to bind a privileged port, or invalid DNS listener config.","commonSituations":"systemd-resolved/stub or another DNS server occupying :53; running as non-root without CAP_NET_BIND_SERVICE; duplicate listeners after config change.","solutions":["Stop competing resolvers (systemctl disable --now systemd-resolved or disable stub listener)","Run with CAP_NET_BIND_SERVICE or as root for port 53","Use a non-privileged dns bind_port for testing"],"exampleFix":"# before\n# systemd-resolved holds :53\n# after\nsudo systemctl disable --now systemd-resolved","handlingStrategy":"validation","validationCode":"func dnsPortFree(proto string) bool {\n\tln, err := net.Listen(proto, \":53\")\n\tif err != nil { return false }\n\t_ = ln.Close()\n\treturn true\n}","typeGuard":null,"tryCatchPattern":"if err := s.Start(ctx); err != nil {\n\tfor _, e := range strings.Split(err.Error(), \"\\n\") {\n\t\tif strings.Contains(e, \"dnssvc\") { log.Printf(\"DNS start failed: %v\", e) }\n\t}\n}","preventionTips":["Disable systemd-resolved stub or other :53 squatters","Run with CAP_NET_BIND_SERVICE when binding port 53"],"tags":["dns","startup","network","bind"],"backgroundTag":"address-already-in-use","analyzedSha":"b41aefbe51c8dde65e2c50f093996afa0502edf9","analyzedAt":"2026-08-27T04:57:55.097Z","schemaVersion":2},"datasetVersion":"2026-08-27T08:17:20.692Z"}