{"id":43789234,"url":"https://github.com/karimknaebel/turm","last_synced_at":"2026-03-08T00:01:55.622Z","repository":{"id":149435730,"uuid":"594762211","full_name":"karimknaebel/turm","owner":"karimknaebel","description":"TUI for the Slurm Workload Manager","archived":false,"fork":false,"pushed_at":"2026-03-03T22:18:13.000Z","size":183,"stargazers_count":455,"open_issues_count":22,"forks_count":23,"subscribers_count":2,"default_branch":"main","last_synced_at":"2026-03-04T01:42:21.054Z","etag":null,"topics":["rust","slurm","terminal","tui","tui-rs"],"latest_commit_sha":null,"homepage":"https://crates.io/crates/turm","language":"Rust","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/karimknaebel.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","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,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2023-01-29T15:13:40.000Z","updated_at":"2026-03-03T22:18:16.000Z","dependencies_parsed_at":null,"dependency_job_id":"fb751303-1839-41ec-9d40-7ab5a3a533df","html_url":"https://github.com/karimknaebel/turm","commit_stats":null,"previous_names":["karimknaebel/turm"],"tags_count":16,"template":false,"template_full_name":null,"purl":"pkg:github/karimknaebel/turm","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/karimknaebel%2Fturm","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/karimknaebel%2Fturm/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/karimknaebel%2Fturm/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/karimknaebel%2Fturm/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/karimknaebel","download_url":"https://codeload.github.com/karimknaebel/turm/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/karimknaebel%2Fturm/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30238083,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-07T23:52:25.683Z","status":"ssl_error","status_checked_at":"2026-03-07T23:52:25.373Z","response_time":53,"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":["rust","slurm","terminal","tui","tui-rs"],"created_at":"2026-02-05T20:00:45.442Z","updated_at":"2026-03-08T00:01:55.616Z","avatar_url":"https://github.com/karimknaebel.png","language":"Rust","funding_links":[],"categories":["Rust"],"sub_categories":[],"readme":"# turm\n\n[![image](https://img.shields.io/pypi/v/turm.svg)](https://pypi.python.org/pypi/turm)\n[![image](https://img.shields.io/crates/v/turm.svg)](https://crates.io/crates/turm)\n[![Conda Version](https://img.shields.io/conda/vn/conda-forge/turm.svg)](https://anaconda.org/conda-forge/turm)\n\nA TUI for [Slurm](https://slurm.schedmd.com/), which provides a convenient way to manage your cluster jobs.\n\n\u003cimg alt=\"turm demo\" src=\"https://github.com/user-attachments/assets/7daade50-def3-4bf8-bf12-df311438094e\" width=\"100%\" /\u003e\n\n`turm` accepts the same options as `squeue` (see [man squeue](https://slurm.schedmd.com/squeue.html#SECTION_OPTIONS)). Use `turm --help` to get a list of all available options. For example, to show only your own jobs, sorted by descending job ID, including all job states (i.e., including completed and failed jobs):\n```shell\nturm --me --sort=-id --states=ALL\n```\n\n## Installation\n\n`turm` is available on [PyPI](https://pypi.org/project/turm/), [crates.io](https://crates.io/crates/turm), and [conda-forge](https://github.com/conda-forge/turm-feedstock):\n\n```shell\n# With uv.\nuv tool install turm\n\n# With pip.\npip install turm\n\n# With cargo.\ncargo install turm\n\n# With pixi.\npixi global install turm\n\n# With conda.\nconda install --channel conda-forge turm\n\n# With wget. Make sure ~/.local/bin is in your $PATH.\nwget https://github.com/karimknaebel/turm/releases/latest/download/turm-x86_64-unknown-linux-musl.tar.gz -O - | tar -xz -C ~/.local/bin/\n```\n\nThe [release page](https://github.com/karimknaebel/turm/releases) also contains precompiled binaries for Linux.\n\n### Shell Completion (optional)\n\n#### Bash\n\nIn your `.bashrc`, add the following line:\n```bash\neval \"$(turm completion bash)\"\n```\n\n#### Zsh\n\nIn your `.zshrc`, add the following line:\n```zsh\neval \"$(turm completion zsh)\"\n```\n\n#### Fish\n\nIn your `config.fish` or in a separate `completions/turm.fish` file, add the following line:\n```fish\nturm completion fish | source\n```\n\n## How it works\n\n`turm` obtains information about jobs by parsing the output of `squeue`.\nThe reason for this is that `squeue` is available on all Slurm clusters, and running it periodically is not too expensive for the Slurm controller ( particularly when [filtering by user](https://slurm.schedmd.com/squeue.html#OPT_user)).\nIn contrast, Slurm's C API is unstable, and Slurm's REST API is not always available and can be costly for the Slurm controller.\nAnother advantage is that we get free support for the exact same CLI flags as `squeue`, which users are already familiar with, for filtering and sorting the jobs.\n\n### Resource usage\n\nTL;DR: `turm` ≈ `watch -n2 squeue` + `tail -f slurm-log.out`\n\nSpecial care has been taken to ensure that `turm` is as lightweight as possible in terms of its impact on the Slurm controller and its file I/O operations.\nThe job queue is updated every two seconds by running `squeue`.\nWhen there are many jobs in the queue, it is advisable to specify a single user to reduce the load on the Slurm controller (see [squeue --user](https://slurm.schedmd.com/squeue.html#OPT_user)).\n`turm` updates the currently displayed log file on every inotify modify notification, and it only reads the newly appended lines after the initial read.\nHowever, since inotify notifications are not supported for remote file systems, such as NFS, `turm` also polls the file for newly appended bytes every two seconds.\n\n## Development without Slurm\n\nFor local UI testing, this repository includes mocks for `squeue`, `scancel`, and `scontrol`:\n\n```shell\nPATH=scripts/mock-slurm/bin:$PATH cargo run -- --me\n```\n\nThe mock commands read/write files in `scripts/mock-slurm/logs`, so you can test log rendering and control actions without a Slurm install.\n\n## Star History\n\n[![Star History Chart](https://api.star-history.com/svg?repos=karimknaebel/turm\u0026type=Date)](https://www.star-history.com/#karimknaebel/turm\u0026Date)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkarimknaebel%2Fturm","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkarimknaebel%2Fturm","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkarimknaebel%2Fturm/lists"}