diff options
| author | Shulhan <m.shulhan@gmail.com> | 2026-02-16 15:22:59 +0700 |
|---|---|---|
| committer | Shulhan <m.shulhan@gmail.com> | 2026-04-15 01:16:22 +0700 |
| commit | eb17f74b599d53a21952ee0b96ab68ed3cb86e3d (patch) | |
| tree | be3c362bcbe9d4d7bc0676f17e85ed3d86692d77 /cmd/pkgsite | |
| parent | e64c25877e784baab341663fbc75ff909ee404f5 (diff) | |
| download | go-x-pkgsite-main.tar.xz | |
The shutdown-idle set the duration to automatically shutdown the HTTP
server when no request after specific duration.
This is to complement the socket based activation to minimize the
resources on local environment.
Diffstat (limited to 'cmd/pkgsite')
| -rw-r--r-- | cmd/pkgsite/main.go | 33 |
1 files changed, 32 insertions, 1 deletions
diff --git a/cmd/pkgsite/main.go b/cmd/pkgsite/main.go index eae690e0..06968618 100644 --- a/cmd/pkgsite/main.go +++ b/cmd/pkgsite/main.go @@ -89,6 +89,10 @@ func main() { flag.BoolVar(&serverCfg.DevMode, "dev", false, "enable developer mode (reload templates on each page load, serve non-minified JS/CSS, etc.)") flag.StringVar(&serverCfg.DevModeStaticDir, "static", "static", "path to folder containing static files served") + var shutdownIdleDuration string + flag.StringVar(&shutdownIdleDuration, `shutdown-idle`, ``, + `Shutdown the server after idle on specific duration.`) + flag.Usage = func() { out := flag.CommandLine.Output() fmt.Fprintf(out, "usage: %s [flags] [PATHS ...]\n", os.Args[0]) @@ -98,6 +102,15 @@ func main() { } flag.Parse() + if shutdownIdleDuration != `` { + var err error + timeout.ShutdownIdleDuration, err = time.ParseDuration(shutdownIdleDuration) + if err != nil { + dief(`invalid shutdown-idle duration %s`, shutdownIdleDuration) + } + timeout.ShutdownIdleTimer = time.NewTimer(timeout.ShutdownIdleDuration) + } + serverCfg.UseLocalStdlib = true serverCfg.GoRepoPath = *goRepoPath serverCfg.Paths = collectPaths(flag.Args()) @@ -171,7 +184,25 @@ func main() { server.Install(router.Handle, nil, nil) mw := timeout.Timeout(54 * time.Second) srv := &http.Server{Addr: addr, Handler: mw(router)} - dief("%v", srv.Serve(ln)) + + if timeout.ShutdownIdleTimer == nil { + dief("%v", srv.Serve(ln)) + } else { + waitq := make(chan struct{}, 1) + go func() { + err = srv.Serve(ln) + if err != nil { + fmt.Fprintf(os.Stderr, "%s\n", err.Error()) + } + waitq <- struct{}{} + }() + select { + case <-waitq: + // Server stopped. + case <-timeout.ShutdownIdleTimer.C: + _ = srv.Shutdown(context.Background()) + } + } } func dief(format string, args ...any) { |
