fix(cron): use atomic write in save_job_output to prevent data loss on crash - #1173
Merged
Conversation
…n crash
save_job_output() used bare open('w') which truncates the output file
immediately. A crash or OOM kill between truncation and the completed
write would silently wipe the job output.
Write now goes to a temp file first, then os.replace() swaps it
atomically — matching the existing save_jobs() pattern in the same file.
Preserves _secure_file() permissions and uses safe cleanup on error.
Cherry-picked from PR #874 by alireza78a, rebased onto current main
with conflict resolution and fixes:
- Kept _secure_dir/_secure_file security calls from PR #757
- Used except BaseException (not bare except) to match save_jobs pattern
- Wrapped os.unlink in try/except OSError to avoid masking errors
Co-authored-by: alireza78a <alireza78a@users.noreply.github.com>
angelburgosrosado
pushed a commit
to angelburgosrosado/hermes-agent
that referenced
this pull request
Apr 27, 2026
…4cde5efa fix(cron): use atomic write in save_job_output to prevent data loss on crash
02356abc
pushed a commit
to 02356abc/hermes-agent
that referenced
this pull request
May 14, 2026
…4cde5efa fix(cron): use atomic write in save_job_output to prevent data loss on crash
waefrebeorn
pushed a commit
to waefrebeorn/slermes
that referenced
this pull request
Jul 2, 2026
…4cde5efa fix(cron): use atomic write in save_job_output to prevent data loss on crash
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Cherry-pick of PR #874 by @alireza78a, rebased onto current main with fixes.
save_job_output()used bareopen('w')which truncates the output file immediately. A crash or OOM kill between truncation and the completed write would silently wipe the job output.Write now goes to a temp file first, then
os.replace()swaps it atomically — matching the existingsave_jobs()pattern in the same file.Fixes applied on top of #874:
_secure_dir/_secure_filesecurity calls from PR security: enforce 0600/0700 file permissions on sensitive files (inspired by openclaw) #757 (the original PR predated these)except BaseException:instead of bareexcept:to match thesave_jobspatternos.unlinkintry/except OSErrorto avoid masking the original exception on cleanup failureTests
Closes #874
Co-authored-by: alireza78a alireza78a@users.noreply.github.com