{"id":13416424,"url":"https://github.com/aptible/supercronic","last_synced_at":"2026-01-30T15:05:37.454Z","repository":{"id":37546007,"uuid":"96564413","full_name":"aptible/supercronic","owner":"aptible","description":"Cron for containers","archived":false,"fork":false,"pushed_at":"2025-12-08T17:16:36.000Z","size":1742,"stargazers_count":2301,"open_issues_count":39,"forks_count":138,"subscribers_count":35,"default_branch":"main","last_synced_at":"2025-12-11T01:54:45.090Z","etag":null,"topics":["supercronic"],"latest_commit_sha":null,"homepage":"","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/aptible.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2017-07-07T18:15:04.000Z","updated_at":"2025-12-10T04:18:46.000Z","dependencies_parsed_at":"2023-02-14T00:31:08.640Z","dependency_job_id":"3b528bed-32c1-4c08-843d-10d41222bde9","html_url":"https://github.com/aptible/supercronic","commit_stats":{"total_commits":209,"total_committers":40,"mean_commits":5.225,"dds":0.631578947368421,"last_synced_commit":"e275ff5aa4f44f150dff12ac8b969f52fcd13f66"},"previous_names":[],"tags_count":30,"template":false,"template_full_name":null,"purl":"pkg:github/aptible/supercronic","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aptible%2Fsupercronic","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aptible%2Fsupercronic/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aptible%2Fsupercronic/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aptible%2Fsupercronic/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/aptible","download_url":"https://codeload.github.com/aptible/supercronic/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aptible%2Fsupercronic/sbom","scorecard":{"id":204415,"data":{"date":"2025-08-11","repo":{"name":"github.com/aptible/supercronic","commit":"1b503ca78f277e89e39da6ac6410fdc3f36869b1"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":5.1,"checks":[{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Security-Policy","score":10,"reason":"security policy file detected","details":["Info: security policy file detected: SECURITY.md:1","Info: Found linked content: SECURITY.md:1","Info: Found disclosure, vulnerability, and/or timelines in security policy: SECURITY.md:1","Info: Found text in security policy: SECURITY.md:1"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Maintained","score":2,"reason":"3 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 2","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Code-Review","score":9,"reason":"Found 24/25 approved changesets -- score normalized to 9","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Binary-Artifacts","score":9,"reason":"binaries present in source code","details":["Warn: binary detected: cronexpr/cronexpr/cronexpr:1"],"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/release.yml:1","Warn: no topLevel permission defined: .github/workflows/test.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:13: update your workflow using https://app.stepsecurity.io/secureworkflow/aptible/supercronic/release.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:18: update your workflow using https://app.stepsecurity.io/secureworkflow/aptible/supercronic/release.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:19: update your workflow using https://app.stepsecurity.io/secureworkflow/aptible/supercronic/test.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:33: update your workflow using https://app.stepsecurity.io/secureworkflow/aptible/supercronic/test.yml/master?enable=pin","Warn: goCommand not pinned by hash: .github/workflows/test.yml:30","Info:   0 out of   4 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   1 goCommand dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE.md:0","Info: FSF or OSI recognized license: MIT License: LICENSE.md:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":0,"reason":"Project has not signed or included provenance with any releases.","details":["Warn: release artifact v0.2.34 not signed: https://api.github.com/repos/aptible/supercronic/releases/226736494","Warn: release artifact v0.2.33 not signed: https://api.github.com/repos/aptible/supercronic/releases/179431237","Warn: release artifact v0.2.32 not signed: https://api.github.com/repos/aptible/supercronic/releases/174823220","Warn: release artifact v0.2.31 not signed: https://api.github.com/repos/aptible/supercronic/releases/173280205","Warn: release artifact v0.2.30 not signed: https://api.github.com/repos/aptible/supercronic/releases/160571298","Warn: release artifact v0.2.34 does not have provenance: https://api.github.com/repos/aptible/supercronic/releases/226736494","Warn: release artifact v0.2.33 does not have provenance: https://api.github.com/repos/aptible/supercronic/releases/179431237","Warn: release artifact v0.2.32 does not have provenance: https://api.github.com/repos/aptible/supercronic/releases/174823220","Warn: release artifact v0.2.31 does not have provenance: https://api.github.com/repos/aptible/supercronic/releases/173280205","Warn: release artifact v0.2.30 does not have provenance: https://api.github.com/repos/aptible/supercronic/releases/160571298"],"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":6,"reason":"branch protection is not maximal on development and all release branches","details":["Info: 'allow deletion' disabled on branch 'master'","Info: 'force pushes' disabled on branch 'master'","Warn: 'branch protection settings apply to administrators' is disabled on branch 'master'","Warn: 'stale review dismissal' is disabled on branch 'master'","Warn: required approving review count is 1 on branch 'master'","Warn: codeowners review is not required on branch 'master'","Info: 'last push approval' is required to merge on branch 'master'","Warn: no status checks found to merge onto branch 'master'","Info: PRs are required in order to make changes on branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"SAST","score":1,"reason":"SAST tool is not run on all commits -- score normalized to 1","details":["Warn: 4 commits out of 29 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-16T23:23:26.053Z","repository_id":37546007,"created_at":"2025-08-16T23:23:26.054Z","updated_at":"2025-08-16T23:23:26.054Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28914896,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-30T12:13:43.263Z","status":"ssl_error","status_checked_at":"2026-01-30T12:13:22.389Z","response_time":66,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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":["supercronic"],"created_at":"2024-07-30T21:00:58.628Z","updated_at":"2026-01-30T15:05:37.444Z","avatar_url":"https://github.com/aptible.png","language":"Go","readme":"\u003cbr\u003e\n\u003cimg src=\"https://user-images.githubusercontent.com/4295811/226700092-ffbd0c01-dba1-4880-8b77-a4d26e6228f0.svg\"  width=\"64\"\u003e\n\n# Supercronic #\n\n\u003e Supercronic has an [announcement blog post over here][blog-post]!\n\nSupercronic is a crontab-compatible job runner, designed specifically to run in\ncontainers.\n \n\n## Why Supercronic? ##\n\nCrontabs are the lingua franca of job scheduling, but typical server cron\nimplementations are ill-suited for container environments:\n\n- They purge their environment before starting jobs. This is an important\n  security feature in multi-user systems, but it breaks a fundamental\n  configuration mechanism for containers.\n- They capture the output from the jobs they run, and often either want to\n  email this output or simply discard it. In a containerized environment,\n  logging task output and errors to `stdout` / `stderr` is often easier to work\n  with.\n- They often don't respond gracefully to `SIGINT` / `SIGTERM` / `SIGQUIT`, and may leave\n  running jobs orphaned when signaled. Again, this makes sense in a server\n  environment where `init` will handle the orphan jobs and Cron isn't restarted\n  often anyway, but it's inappropriate in a container environment as it'll\n  result in jobs being forcefully terminated (i.e.  `SIGKILL`'ed) when the\n  container exits.\n- They often try to send their logs to syslog. This conveniently provides\n  centralized logging when a syslog server is running, but with containers,\n  simply logging to `stdout` or `stderr` is preferred.\n\nFinally, they are often quiet, making these issues difficult to understand and\ndebug!\n\nSupercronic's goal is to behave exactly how you would expect `cron` running in\na container to behave:\n\n- Your environment variables are available in jobs\n- Job output is logged to `stdout` / `stderr`\n- `SIGTERM` triggers a graceful shutdown (and so does `SIGINT`, which you can\n  deliver via CTRL+C when used interactively)\n- Job return codes and schedules are logged to `stdout` / `stderr`\n- `SIGUSR2` triggers a graceful shutdown and reloads the crontab configuration\n- `SIGQUIT` triggers a graceful shutdown\n\n## How does it work? ##\n\n- Install Supercronic (see below)\n- Point it at a crontab: `supercronic CRONTAB`\n- You're done!\n\n\n## Who is it for?\n\nWe (Aptible) originally created Supercronic to make it easy for customers of our\n[No Infrastructure Platform][aptible-app] to incorporate\nperiodic jobs in their apps, but it's more broadly applicable to **anyone\nrunning cron jobs in containers**.\n\n## Installation\n\n### Download\n\nThe easiest way to install Supercronic is to download a pre-built binary.\n\nNavigate to [the releases page][releases], and grab the build that suits your\nsystem. The releases include example `Dockerfile` stanzas to install\nSupercronic that you can easily include in your own `Dockerfile` or adjust as\nneeded.\n\nNote: If you are unsure which binary is right for you, try\n`supercronic-linux-amd64`.\n\n### Build\n\nYou can also build Supercronic from source.\n\nRun the following to fetch Supercronic, install its dependencies, and install\nit:\n\n```\ngo get -d github.com/aptible/supercronic\ncd \"${GOPATH}/src/github.com/aptible/supercronic\"\ngo mod vendor\ngo install\n```\n\n\n## Crontab format ##\n\nBroadly speaking, Supercronic tries to process crontabs just like Vixie cron\ndoes. In most cases, it should be compatible with your existing crontab.\n\nThere are, however, a few exceptions:\n\n- First, Supercronic supports second-resolution schedules: Under the hood,\n  Supercronic uses [the `cronexpr` package][cronexpr], so refer to its\n  documentation to know exactly what you can do.\n- Second, Supercronic does not support changing users when running tasks.\n  Setting `USER` in your crontab will have no effect. Changing users is usually\n  best accomplished in container environments via other means, e.g., by adding\n  a `USER` directive to your Dockerfile.\n\n\nHere's an example crontab:\n\n```\n# Run every minute\n*/1 * * * * echo \"hello\"\n\n# Run every 2 seconds\n*/2 * * * * * * ls 2\u003e/dev/null\n\n# Run once every hour\n@hourly echo \"$SOME_HOURLY_JOB\"\n```\n\n\n## Environment variables ##\n\nJust like regular cron, Supercronic lets you specify environment variables in\nyour crontab using a `KEY=VALUE` syntax.\n\nHowever, this is only here for compatibility with existing crontabs, and using\nthis feature is generally **not recommended** when using Supercronic.\n\nIndeed, Supercronic does not wipe your environment before running jobs, so if\nyou need environment variables to be available when your jobs run, just set\nthem before starting Supercronic itself, and your jobs will inherit them.\n\nFor example, if you're using Docker, jobs started by Supercronic will inherit\nthe environment variables defined using `ENV` directives in your `Dockerfile`,\nand variables passed when you run the container (e.g. via `docker run -e\nSOME_VARIABLE=SOME_VALUE`).\n\nUnless you've used cron before, this is exactly how you expect environment\nvariables to work!\n\n\n## Timezone ##\n\nSupercronic uses your current timezone from `/etc/localtime` to schedule jobs.\nYou can also override the timezone by setting the environment variable `TZ`\n(e.g. `TZ=Europe/Berlin`) when running Supercronic. You may need to install\n`tzdata` in order for Supercronic to find the supplied timezone.\n\nYou can override `TZ` to use a different timezone, but if you need your cron\njobs to be scheduled in a timezone A and have them run in a timezone B, you can\nrun with `/etc/localtime` or `TZ` set to `B` and add a `CRON_TZ=A` line to your\ncrontab.\n\nIf you're unsure what timezone Supercronic is using, you can run it with the\n`-debug` flag to confirm.\n\n\n## Logging ##\n\nSupercronic provides rich logging, and will let you know exactly what command\ntriggered a given message. Here's an example:\n\n```\n$ cat ./my-crontab\n*/5 * * * * * * echo \"hello from Supercronic\"\n\n$ ./supercronic ./my-crontab\nINFO[2017-07-10T19:40:44+02:00] read crontab: ./my-crontab\nINFO[2017-07-10T19:40:50+02:00] starting                                      iteration=0 job.command=\"echo \"hello from Supercronic\"\" job.position=0 job.schedule=\"*/5 * * * * * *\"\nINFO[2017-07-10T19:40:50+02:00] hello from Supercronic                        channel=stdout iteration=0 job.command=\"echo \"hello from Supercronic\"\" job.position=0 job.schedule=\"*/5 * * * * * *\"\nINFO[2017-07-10T19:40:50+02:00] job succeeded                                 iteration=0 job.command=\"echo \"hello from Supercronic\"\" job.position=0 job.schedule=\"*/5 * * * * * *\"\nINFO[2017-07-10T19:40:55+02:00] starting                                      iteration=1 job.command=\"echo \"hello from Supercronic\"\" job.position=0 job.schedule=\"*/5 * * * * * *\"\nINFO[2017-07-10T19:40:55+02:00] hello from Supercronic                        channel=stdout iteration=1 job.command=\"echo \"hello from Supercronic\"\" job.position=0 job.schedule=\"*/5 * * * * * *\"\nINFO[2017-07-10T19:40:55+02:00] job succeeded                                 iteration=1 job.command=\"echo \"hello from Supercronic\"\" job.position=0 job.schedule=\"*/5 * * * * * *\"\n```\n\n\n## Debugging ##\n\nIf your jobs aren't running, or you'd simply like to double-check your crontab\nsyntax, pass the `-debug` flag for more verbose logging:\n\n```\n$ ./supercronic -debug ./my-crontab\nINFO[2017-07-10T19:43:51+02:00] read crontab: ./my-crontab\nDEBU[2017-07-10T19:43:51+02:00] try parse(7): */5 * * * * * * echo \"hello from Supercronic\"[0:15] = */5 * * * * * *\nDEBU[2017-07-10T19:43:51+02:00] job will run next at 2017-07-10 19:44:00 +0200 CEST  job.command=\"echo \"hello from Supercronic\"\" job.position=0 job.schedule=\"*/5 * * * * * *\"\n```\n\n\n## Duplicate Jobs ##\n\nSupercronic will wait for a given job to finish before that job is scheduled\nagain (some cron implementations do this, others don't). If a job is falling\nbehind schedule (i.e. it's taking too long to finish), Supercronic will warn\nyou.\n\nHere is an example:\n\n```\n$ cat ./my-crontab\n# Sleep for 2 seconds every second. This will take too long.\n* * * * * * * sleep 2\n\n$ ./supercronic ./my-crontab\nINFO[2017-07-11T12:24:25+02:00] read crontab: ./my-crontab\nINFO[2017-07-11T12:24:27+02:00] starting                                      iteration=0 job.command=\"sleep 2\" job.position=0 job.schedule=\"* * * * * * *\"\nINFO[2017-07-11T12:24:29+02:00] job succeeded                                 iteration=0 job.command=\"sleep 2\" job.position=0 job.schedule=\"* * * * * * *\"\nWARN[2017-07-11T12:24:29+02:00] job took too long to run: it should have started 1.009438854s ago  job.command=\"sleep 2\" job.position=0 job.schedule=\"* * * * * * *\"\nINFO[2017-07-11T12:24:30+02:00] starting                                      iteration=1 job.command=\"sleep 2\" job.position=0 job.schedule=\"* * * * * * *\"\nINFO[2017-07-11T12:24:32+02:00] job succeeded                                 iteration=1 job.command=\"sleep 2\" job.position=0 job.schedule=\"* * * * * * *\"\nWARN[2017-07-11T12:24:32+02:00] job took too long to run: it should have started 1.014474099s ago  job.command=\"sleep 2\" job.position=0 job.schedule=\"* * * * * * *\"\n```\n\nYou can optionally disable this behavior and allow overlapping instances of\nyour jobs by passing the `-overlapping` flag to Supercronic. Supercronic will\nstill warn about jobs falling behind, but will run duplicate instances of them.\n\n\n## Reload crontab\n\nSend `SIGUSR2` to Supercronic to reload the crontab:\n\n```bash\n# docker environment (Supercronic needs to be PID 1 in the container)\ndocker kill --signal=USR2 \u003ccontainer id\u003e\n\n# shell\nkill -USR2 \u003cpid\u003e\n```\n\nIf you are running Supercronic in an environment were sending `SIGUSR2` is a bit of a hassle, or you expect frequent updates to your crontab file, you may opt to run Supercronic with the `-inotify` flag. This will start a watch on the crontab file, reloading it on changes. An example use case would be a kubernetes pod running Supercronic that mounts its crontab file from a configMap. With the `-inotify` flag, any update to this configmap, provided it is not immutable, will trigger a reload in Supercronic, without you having to figure out a mechanism to send the `SIGUSR2` signal to the pod. The watch on the crontab file triggers on `Write` and `Remove` events, the latter ensures detection of kubernetes' atomic writes.\n\n```\n$ ./supercronic -inotify ./my-crontab\n...\ntime=\"2024-09-11T09:23:18+02:00\" level=debug msg=\"event: CHMOD         \\\"./my-crontab\\\", watch-list: []\"\ntime=\"2024-09-11T09:23:18+02:00\" level=debug msg=\"event: REMOVE        \\\"./my-crontab\\\", watch-list: []\"\ntime=\"2024-09-11T09:23:18+02:00\" level=debug msg=\"watched file changed\"\ntime=\"2024-09-11T09:23:18+02:00\" level=info msg=\"received user defined signal 2, reloading crontab\"\ntime=\"2024-09-11T09:23:18+02:00\" level=info msg=\"waiting for jobs to finish\"\ntime=\"2024-09-11T09:23:18+02:00\" level=debug msg=\"shutting down\" job.command=\"sleep 2\" job.position=0 job.schedule=\"* * * * *\"\ntime=\"2024-09-11T09:23:18+02:00\" level=info msg=\"read crontab: ./my-crontab\"\ntime=\"2024-09-11T09:23:18+02:00\" level=debug msg=\"try parse (7 fields): '* * * * * sleep 5'\"\ntime=\"2024-09-11T09:23:18+02:00\" level=debug msg=\"failed to parse (7 fields): '* * * * * sleep 5': failed: syntax error in day-of-week field: 'sleep'\"\ntime=\"2024-09-11T09:23:18+02:00\" level=debug msg=\"try parse (6 fields): '* * * * * sleep'\"\ntime=\"2024-09-11T09:23:18+02:00\" level=debug msg=\"failed to parse (6 fields): '* * * * * sleep': failed: syntax error in year field: 'sleep'\"\ntime=\"2024-09-11T09:23:18+02:00\" level=debug msg=\"try parse (5 fields): '* * * * *'\"\ntime=\"2024-09-11T09:23:18+02:00\" level=debug msg=\"job will run next at 2024-09-11 09:24:00 +0200 CEST\" job.command=\"sleep 5\" job.position=0 job.schedule=\"* * * * *\"\n\n```\n\n## Testing your crontab\n\nUse the `-test` flag to prompt Supercronic to verify your crontab, but not\nexecute it. This is useful as part of e.g. a build process to verify the syntax\nof your crontab.\n\n\n## Level-based logging ##\n\nBy default, Supersonic routes all logs to `stderr`. If you wish to change this\nbehaviour to level-based logging, pass the `-split-logs` flag to route debug\nand info level logs to `stdout`:\n\n ```\n$ ./supercronic -split-logs ./my-crontab 1\u003e./stdout.log\n$ cat ./stdout.log\ntime=\"2019-01-12T19:34:57+09:00\" level=info msg=\"read crontab: ./my-crontab\"\ntime=\"2019-01-12T19:35:00+09:00\" level=info msg=starting iteration=0 job.command=\"echo \\\"hello from Supercronic\\\"\" job.position=0 job.schedule=\"*/5 * * * * * *\"\ntime=\"2019-01-12T19:35:00+09:00\" level=info msg=\"hello from Supercronic\" channel=stdout iteration=0 job.command=\"echo \\\"hello from Supercronic\\\"\" job.position=0 job.schedule=\"*/5 * * * * * *\"\ntime=\"2019-01-12T19:35:00+09:00\" level=info msg=\"job succeeded\" iteration=0 job.command=\"echo \\\"hello from Supercronic\\\"\" job.position=0 job.schedule=\"*/5 * * * * * *\"\n```\n\n## Integrations\n\n### Sentry\n\nSupercronic offers integration with Sentry for real-time error tracking and reporting. This feature helps in identifying, triaging, and fixing crashes in your cron jobs.\n\n#### Enabling Sentry\n\nTo enable Sentry reporting, configure the Sentry Data Source Name (DSN) e.g. use the `-sentry-dsn` argument when starting Supercronic\n```\n$ ./supercronic -sentry-dsn DSN\n```\n\nYou can also specify the DSN via the `SENTRY_DSN` environment variable.\nWhen a DSN is specified via both the environment variable and the command line parameter\nthe parameter's DSN has priority.\n\n\n#### Additional Sentry Configuration\n\nYou can also specify the environment and release for Sentry to provide more context to the error reports:\n\nEnvironment: Use the `-sentry-environment` flag or the `SENTRY_ENVIRONMENT` environment variable to set the environment tag in Sentry.\n\n```\n$ ./supercronic -sentry-dsn YOUR_SENTRY_DSN -sentry-environment YOUR_ENVIRONMENT\n```\n\nRelease: Use the `-sentry-release` flag or the `SENTRY_RELEASE` environment variable to set the release tag in Sentry.\n\n```\n$ ./supercronic -sentry-dsn YOUR_SENTRY_DSN -sentry-release YOUR_RELEASE\n```\n\n## Questions and Support ###\n\nPlease feel free to open an issue in this repository if you have any question\nabout Supercronic!\n\nNote that if you're trying to use Supercronic on Aptible App, we have [a\ndedicated support article][how-to-run-scheduled-tasks].\n\n\n## Contributing ##\n\nPRs are always welcome! Before undertaking a major change, consider opening an\nissue for some discussion.\n\n\n## License ##\n\nSee [LICENSE.md](./LICENSE.md).\n\n\n## Copyright ##\n\nCopyright (c) 2019 [Aptible][aptible]. All rights reserved.\n\n  [aptible-logo]: https://raw.github.com/aptible/straptible/master/lib/straptible/rails/templates/public.api/icon-60px.png\n  [blog-post]: https://www.aptible.com/blog/cron-for-containers-introduction-supercronic\n  [cronexpr]: https://github.com/aptible/supercronic/tree/master/cronexpr\n  [releases]: https://github.com/aptible/supercronic/releases\n  [dep]: https://github.com/golang/dep\n  [aptible]: https://www.aptible.com\n  [aptible-app]: https://www.aptible.com/product\n  [how-to-run-scheduled-tasks]: https://www.aptible.com/docs/scheduled-tasks\n","funding_links":[],"categories":["Docker Images","Go"],"sub_categories":["Base Tools"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faptible%2Fsupercronic","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Faptible%2Fsupercronic","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faptible%2Fsupercronic/lists"}