{"id":29151223,"url":"https://github.com/karpeleslab/shutdown","last_synced_at":"2025-07-01T00:08:56.900Z","repository":{"id":245785580,"uuid":"819225232","full_name":"KarpelesLab/shutdown","owner":"KarpelesLab","description":null,"archived":false,"fork":false,"pushed_at":"2025-03-18T01:14:51.000Z","size":12,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-03-18T02:26:01.821Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/KarpelesLab.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-06-24T05:03:09.000Z","updated_at":"2025-03-18T01:14:54.000Z","dependencies_parsed_at":"2024-06-24T06:24:50.087Z","dependency_job_id":"fc4b8e9f-c64c-420c-b3eb-841169846506","html_url":"https://github.com/KarpelesLab/shutdown","commit_stats":null,"previous_names":["karpeleslab/shutdown"],"tags_count":6,"template":false,"template_full_name":null,"purl":"pkg:github/KarpelesLab/shutdown","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KarpelesLab%2Fshutdown","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KarpelesLab%2Fshutdown/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KarpelesLab%2Fshutdown/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KarpelesLab%2Fshutdown/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/KarpelesLab","download_url":"https://codeload.github.com/KarpelesLab/shutdown/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KarpelesLab%2Fshutdown/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":262870877,"owners_count":23377314,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-07-01T00:08:54.971Z","updated_at":"2025-07-01T00:08:56.798Z","avatar_url":"https://github.com/KarpelesLab.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![GoDoc](https://godoc.org/github.com/KarpelesLab/shutdown?status.svg)](https://godoc.org/github.com/KarpelesLab/shutdown)\n\n# shutdown\n\nA lightweight Go library that provides utilities for graceful application shutdown handling, particularly useful for long-running services and daemons.\n\n## Features\n\n- **Signal Handling**: Automatically handles SIGINT (Ctrl-C) and SIGTERM signals\n- **Graceful Shutdown**: Executes registered cleanup functions in LIFO order\n- **Error Management**: Propagate fatal errors that should trigger application shutdown\n- **Concurrency Support**: Run background goroutines that can trigger shutdown on error\n\n## Installation\n\n```\ngo get github.com/KarpelesLab/shutdown\n```\n\n## Usage \n\n```go\nimport (\n    \"net\"\n    \"log/slog\"\n\n    \"github.com/KarpelesLab/shutdown\"\n)\n\nfunc main() {\n    // Setup signal handlers early in your application\n    shutdown.SetupSignals()\n\n    // Run your application components\n    go launchHttp()\n    \n    // Example of running multiple background tasks with error handling\n    shutdown.Go(\n        task1,\n        task2,\n        // More tasks...\n    )\n\n    // Wait for shutdown (this should be the last call in main)\n    shutdown.Wait()\n}\n\nfunc launchHttp() {\n    l, err := net.Listen(\"tcp\", \":8080\")\n    if err != nil {\n        // Report fatal errors that should trigger shutdown\n        shutdown.Fatalf(\"failed to listen for the http server: %w\", err)\n        return\n    }\n\n    // Register cleanup functions to be executed during shutdown\n    shutdown.Defer(func() {\n        slog.Info(\"Closing HTTP listener\")\n        l.Close()\n    })\n    \n    // Your HTTP server implementation...\n}\n\n// Example task function that returns an error\nfunc task1() error {\n    // If this returns an error, it will trigger shutdown\n    return nil\n}\n```\n\n## Core Functions\n\n- `SetupSignals()`: Configures signal handlers for graceful shutdown (call early in main)\n- `Defer(func())`: Registers cleanup functions to be executed during shutdown (LIFO order)\n- `Fatalf(format, args...)`: Reports a fatal error that triggers shutdown\n- `Go(funcs ...func() error)`: Runs functions in background goroutines, errors trigger shutdown\n- `Shutdown()`: Manually triggers the shutdown process\n- `Wait()`: Blocks until shutdown is triggered, then runs cleanup functions (call last in main)\n\n## Shutdown Triggers\n\nShutdown can be triggered in several ways:\n\n1. OS Signals (SIGINT/Ctrl-C or SIGTERM)\n2. Fatal errors reported via `Fatalf()`\n3. Errors returned from functions started with `Go()`\n4. Manual trigger via `Shutdown()`\n\nWhen shutdown is triggered, all functions registered with `Defer()` are executed in LIFO order (last registered, first executed).\n\n## License\n\nSee [LICENSE](LICENSE) file.","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkarpeleslab%2Fshutdown","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkarpeleslab%2Fshutdown","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkarpeleslab%2Fshutdown/lists"}