{"id":15831207,"url":"https://github.com/somajitdey/runman","last_synced_at":"2026-04-27T21:31:03.336Z","repository":{"id":163914784,"uuid":"624598697","full_name":"SomajitDey/runman","owner":"SomajitDey","description":"Linux job scheduler / manager based on task-spooler. Notifies via Telegram on job completion.","archived":false,"fork":false,"pushed_at":"2023-05-11T14:21:04.000Z","size":50,"stargazers_count":1,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2024-10-12T12:18:44.334Z","etag":null,"topics":["job-scheduler","linux","run-manager","task-spooler","telegram-bot","workload-management"],"latest_commit_sha":null,"homepage":"","language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/SomajitDey.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":"2023-04-06T20:40:47.000Z","updated_at":"2023-04-06T20:57:34.000Z","dependencies_parsed_at":null,"dependency_job_id":"26d11b86-d404-4b7d-9a27-680360335fe5","html_url":"https://github.com/SomajitDey/runman","commit_stats":{"total_commits":11,"total_committers":2,"mean_commits":5.5,"dds":0.2727272727272727,"last_synced_commit":"c6f24b83bfdbbaf299dd6bb0996ad07b4f3adf07"},"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/SomajitDey/runman","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SomajitDey%2Frunman","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SomajitDey%2Frunman/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SomajitDey%2Frunman/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SomajitDey%2Frunman/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/SomajitDey","download_url":"https://codeload.github.com/SomajitDey/runman/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SomajitDey%2Frunman/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32356596,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-27T20:07:02.737Z","status":"ssl_error","status_checked_at":"2026-04-27T20:07:00.910Z","response_time":128,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: 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":["job-scheduler","linux","run-manager","task-spooler","telegram-bot","workload-management"],"created_at":"2024-10-05T12:01:37.883Z","updated_at":"2026-04-27T21:31:03.323Z","avatar_url":"https://github.com/SomajitDey.png","language":"Shell","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Run Man(ager)\r\nRun Man (`runman`) is a humble wrapper around [task-spooler](http://viric.name/soft/ts/) (`tsp`) for easily scheduling and managing jobs in any multicore Linux node. Basically, it's nothing but a poor and lazy man's workload manager. If [SLURM](https://slurm.schedmd.com/documentation.html), [PBS](https://www.openpbs.org/) and the likes seem like an overkill for your multiprocessing needs, and vanilla `tsp` seems too low-level, then `runman` might be your thing.\r\n\r\n### Features\r\n- System-wide task-spooler queue with as many slots as number of CPUs in the system.\r\n- `USER` submits [`.job`](/example.job) file that lists her requirements such as  \r\n    - command/script/executable to be run\r\n    - number of processors needed\r\n    - paths to store STDOUT and/or STDERR\r\n    - max. execution time (wall clock)\r\n    - working directory\r\n    - dependency on a previous job\r\n- `USER` is notified via [Telegram](https://telegram.org/) on job completion by a [bot](https://github.com/fabianonline/telegram.sh).\r\n- Usual job management tools such as - status query, abort/removal, prioritization.\r\n- Job arrays similar to [PBS job arrays](https://centers.hpc.mil/users/advancedTopics/Job_Arrays.html)\r\n\r\n### Installation\r\n```bash\r\n# Download\r\ncurl -LO https://raw.githubusercontent.com/SomajitDey/runman/main/runman\r\n\r\n# Set permission\r\nchmod a+rx ./runman\r\n\r\n# Install at PATH\r\nsudo install ./runman /usr/local/bin/\r\n\r\n# Local installation (for non-sudoers).\r\nexport PATH=\"${HOME}/.bin:${PATH}\" # Put this in ~/.bashrc.\r\ninstall -D -t \"${HOME}\"/.bin/ ./runman\r\n```\r\nAlso install [`tsp`](https://command-not-found.com/tsp), [`telegram`](https://github.com/fabianonline/telegram.sh#installation--configuration), [`jq`](https://command-not-found.com/jq) and [`curl`](https://command-not-found.com/curl).\r\n\r\n### Usage\r\n```bash\r\nrunman help\r\n```\r\n\r\n### Pro tip\r\nIn a *trusted* environment, the sysadmin may [create](https://github.com/fabianonline/telegram.sh#installation--configuration) a single telegram bot to serve all the `USER`s. The token may be saved in the global config `/etc/telegram.sh.conf` as the key-value pair:\r\n```bash\r\nTELEGRAM_TOKEN='123456:AbcDefGhi-JlkMno'\r\n```\r\nIn such a case, all the `USER`s must be sent the Telegram address of the bot: `@\u003cbot_username\u003e` or `https://t.me/\u003cbot_username\u003e` so they can subscribe to the feed using \r\n```bash\r\nrunman tgfeed\r\n```\r\n\r\n### Known Issue(s)\r\n- The key value pair `stderr=\u003cpath\u003e` provided in `.job` file doesn't work, atleast in Ubuntu 20.04. The underlying reason seems to be a bug in task-spooler itself: `tsp -E` doesn't work as expected.\r\n\r\n- `runman` can't kill orphaned processes spawned by a job that has finished. The orphaned processes may consume CPU time at the background unbeknownst to `runman` or its core `tsp`. Hence, until fixed, it's the job of the user to make sure her job doesn't create (resource consuming) orphaned processes. For example, if her shell script spawns processes in background with `\u0026`, she must use the `wait` statement at the end of her script, so that her job finishes only after all her spawned processes have exited.\r\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsomajitdey%2Frunman","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsomajitdey%2Frunman","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsomajitdey%2Frunman/lists"}