Example output from the previous script: *journalctl -t weewx-backup --since "1 hour ago"* Sep 21 22:01:49 cyclone weewx-backup[25528]: [2026-09-21T22:01:49-05:00] Starting weewx backup Sep 21 22:01:49 cyclone weewx-backup[25528]: [2026-09-21T22:01:49-05:00] Creating SQLite backup: /var/tmp/wxbackups/weewx-20260921-220149.sdb Sep 21 22:01:51 cyclone weewx-backup[25528]: [2026-09-21T22:01:51-05:00] Checking database integrity Sep 21 22:01:55 cyclone weewx-backup[25528]: [2026-09-21T22:01:55-05:00] Compressing backup Sep 21 22:02:38 cyclone weewx-backup[25528]: [2026-09-21T22:02:38-05:00] Removing backups older than 30 days Sep 21 22:02:38 cyclone weewx-backup[25528]: [2026-09-21T22:02:38-05:00] Backup complete: /var/tmp/wxbackups/weewx-20260921-220149.sdb.gz
On Monday, September 21, 2026 at 9:59:55 PM UTC-5 Warren Gill wrote: > The AI is not "drivel" but it's also not really helpful. AI tends to keep > leading you down the same incorrect path just to fulfill your instruction. > SQLite3 has included a backup API since 3.3.0. There's no need to > stop/start/quiesce just use the .backup command. > https://www.sqlite.org/backup.html > Most of this script is error checking stuff I borrowed from my other error > checking stuff. It really just boils down to: > > *sqlite3 /var/lib/weewx/weewx.sdb ".backup /var/tmp/weewx-$(date > +%Y%m%d)-backup.sdb"* > > Here's the whole script nonetheless: > > #!/usr/bin/env bash > set -Eeuo pipefail > > # Uses SQLite Online Backup API > # https://www.sqlite.org/backup.html > # Logs to journal > # View the logs with journalctl -t weewx-backup --since "1 hour ago" > > # > # Add to crontab to run daily at 2 AM: > # MAILTO="[email protected]" > # 0 2 * * * /usr/bin/env bash /usr/local/bin/weewx-backup.sh > # > DB="/var/lib/weewx/weewx.sdb" > BACKUPDIR="/var/tmp/wxbackups" > TIMESTAMP="$(date +%Y%m%d-%H%M%S)" > BACKUP_PATH="${BACKUPDIR}/weewx-${TIMESTAMP}.sdb" > ARCHIVE_PATH="${BACKUP_PATH}.gz" > > mkdir -p "$BACKUPDIR" > exec 1> >(logger -t weewx-backup) 2>&1 > > log() { > echo "[$(date -Is)] $*" > } > > log "Starting weewx backup" > > if [ ! -f "$DB" ]; then > log "ERROR: database not found: $DB" > exit 1 > fi > > if ! command -v sqlite3 >/dev/null 2>&1; then > log "ERROR: sqlite3 is not installed" > exit 1 > fi > > log "Creating SQLite backup: $BACKUP_PATH" > if ! sqlite3 "$DB" ".backup '$BACKUP_PATH'"; then > log "ERROR: SQLite backup failed" > exit 1 > fi > > log "Checking database integrity" > if ! sqlite3 "$BACKUP_PATH" "PRAGMA integrity_check;" | grep -qi '^ok$'; > then > log "ERROR: backup integrity check failed" > rm -f "$BACKUP_PATH" > exit 1 > fi > > log "Compressing backup" > gzip -9 "$BACKUP_PATH" > > log "Removing backups older than 30 days" > find "$BACKUPDIR" -type f -name 'weewx-*.sdb.gz' -mtime +30 -delete > > log "Backup complete: $ARCHIVE_PATH" > exit 0 > > On Monday, September 21, 2026 at 8:47:49 PM UTC-5 Pablo Sanchez wrote: > >> I found the Gen AI response on point. >> >> What's more disconcerting would be a single person dictating what is and >> what isn't allowed to be posted to a worldwide list. >> --- >> pablo >> >> On September 21, 2026 20:55:14 John Bonzey <[email protected]> wrote: >> >>> How is it drivel. it gives the completed script with an explanation >>> >>> On Monday, September 21, 2026 at 8:51:02 PM UTC-4 Vince Skahan wrote: >>> >>>> Please no three page AI drivel. Please. >>>> >>>> On Monday, September 21, 2026 at 5:06:31 PM UTC-7 John Bonzey wrote: >>>> >>>>> Claude says the following; >>>>> >>>>> Subject: Re: bash while loop syntax for weewx backup script >>>>> >>>>> Hi, >>>>> >>>>> I think I spotted the issue. Your while condition is: >>>>> >>>>> while [ systemctl -q is-active weewx ]; >>>>> >>>>> The problem is that [ ... ] is the "test" command - it doesn't >>>>> actually run systemctl at all. It just checks whether the string >>>>> "systemctl >>>>> -q is-active weewx" is non-empty, which is always true, so the loop never >>>>> ends based on weewx's real state (it just happens to work when weewx >>>>> stops >>>>> quickly, since the loop body still runs and eventually you get lucky with >>>>> timing). >>>>> >>>>> The fix is to drop the [ ] brackets entirely and use the command >>>>> itself as the condition. In bash, while just checks the exit status of >>>>> whatever command you give it - it doesn't need [ ] at all unless you're >>>>> testing a string, number, or file: >>>>> >>>>> while systemctl -q is-active weewx; >>>>> do >>>>> sleep 1 >>>>> echo $(date): Weewx is still stopping >> >>>>> /var/log/weewx-backup.log >>>>> done >>>>> >>>>> systemctl -q is-active weewx exits 0 (true) while the service is >>>>> active, and non-zero once it's fully stopped - which is exactly what you >>>>> want the loop to check. >>>>> >>>>> General rule of thumb: use while [ condition ] for string/number/file >>>>> tests, and while some_command when you want to "loop while this command >>>>> succeeds." >>>>> >>>>> Your instinct not to copy the DB mid-write is exactly right, and this >>>>> fix makes that work as intended. >>>>> >>>>> One more suggestion: it's worth adding a timeout guard in case weewx >>>>> ever hangs on stop, so the script can't wait forever. Here's the full >>>>> script with that added: >>>>> >>>>> #!/bin/bash >>>>> # >>>>> # Stop weewx service >>>>> echo $(date): Weewx is stopping >> /var/log/weewx-backup.log >>>>> systemctl stop weewx >>>>> # >>>>> # Check service has stopped (with timeout) >>>>> timeout=30 >>>>> count=0 >>>>> while systemctl -q is-active weewx; >>>>> do >>>>> if [ $count -ge $timeout ]; then >>>>> echo $(date): Weewx did not stop after ${timeout}s - >>>>> aborting backup >> /var/log/weewx-backup.log >>>>> systemctl start weewx >>>>> exit 1 >>>>> fi >>>>> sleep 1 >>>>> count=$((count + 1)) >>>>> echo $(date): Weewx is still stopping >> >>>>> /var/log/weewx-backup.log >>>>> done >>>>> echo $(date): Weewx has stopped >> /var/log/weewx-backup.log >>>>> # >>>>> # Copy files to backup folder >>>>> echo $(date): Backup is starting >> /var/log/weewx-backup.log >>>>> tar -czvf /mnt/backup/weewx-conf.tar.gz /etc/weewx >>>>> tar -czvf /mnt/backup/weewx-db.tar.gz /var/lib/weewx/weewx.sdb >>>>> echo $(date): Backup is complete >> /var/log/weewx-backup.log >>>>> # >>>>> # Start weewx service >>>>> systemctl start weewx >>>>> echo $(date): Weewx is starting >> /var/log/weewx-backup.log >>>>> >>>>> With the timeout added, if weewx ever fails to stop within 30 seconds, >>>>> the script restarts weewx, logs the failure, and exits before touching >>>>> the >>>>> backup files - so a hung stop can't leave weewx down or risk copying a >>>>> database mid-write. >>>>> >>>>> Hope that helps! >>>>> ------------------------------ >>>>> *From:* [email protected] <[email protected]> on >>>>> behalf of David Schulz <[email protected]> >>>>> *Sent:* Monday, September 21, 2026 7:22 PM >>>>> *To:* weewx-user <[email protected]> >>>>> *Subject:* [weewx-user] Assistance with While condition for backup >>>>> script >>>>> >>>>> Hi >>>>> I'm attempting to write my first bash script to backup weewx. I'm >>>>> struggling with the syntax of a condition for a while loop that checks if >>>>> weewx has stopped or is still stopping. >>>>> >>>>> I don't really understand the syntax of the example conditions I can >>>>> find for various tutorials on using while to create a loop. I cannot >>>>> find >>>>> anywhere an exact example of using 'systemctl is-active' as the condition >>>>> for a while loop. >>>>> >>>>> Appreciate any feedback from people more learned than I. >>>>> >>>>> TIA >>>>> >>>>> Here's what I have at the moment. If I run this script when I know >>>>> weewx won't be writing to the database, the commands to zip the files >>>>> into >>>>> the backup directory all work OK. >>>>> >>>>> I don't think I want to be copying the database file in the middle of >>>>> a write. So I have a separate script with the backup section removed >>>>> just >>>>> trying to test the stopping, check has stopped and start parts of the >>>>> script. I've been unsuccessfully futzing around with different condition >>>>> syntax and actively trying to run it when weewx is active and the stop >>>>> command will take a while to execute while the weewx main loop completes. >>>>> >>>>> But TBH I'm just wandering about in the dark. >>>>> >>>>> ``` >>>>> #!/bin/bash >>>>> # >>>>> # Stop weewx service >>>>> echo $(date): Weewx is stopping >> /var/log/weewx-backup.log >>>>> systemctl stop weewx >>>>> # >>>>> # Check service has stopped >>>>> while [ systemctl -q is-active weewx ]; >>>>> do >>>>> sleep 1 >>>>> echo $(date): Weewx is still stopping >> >>>>> /var/log/weewx-backup.log >>>>> done >>>>> echo $(date): Weewx has stopped >> /var/log/weewx-backup.log >>>>> # >>>>> # Copy files to backup folder >>>>> echo $(date): Backup is starting >> /var/log/weewx-backup.log >>>>> tar -czvf /mnt/backup/weewx-conf.tar.gz /etc/weewx >>>>> tar -czvf /mnt/backup/weewx-db.tar.gz /var/lib/weewx/weewx.sdb >>>>> echo $(date): Backup is complete >> /var/log/weewx-backup.log >>>>> # >>>>> # Start weewx service >>>>> systemctl start weewx >>>>> echo $(date): Weewx is starting >> /var/log/weewx-backup.log >>>>> ``` >>>>> >>>>> -- >>>>> You received this message because you are subscribed to the Google >>>>> Groups "weewx-user" group. >>>>> To unsubscribe from this group and stop receiving emails from it, send >>>>> an email to [email protected]. >>>>> To view this discussion visit >>>>> https://groups.google.com/d/msgid/weewx-user/df76a922-ace3-44ae-a65a-0a50b6f8fe92n%40googlegroups.com >>>>> >>>>> <https://groups.google.com/d/msgid/weewx-user/df76a922-ace3-44ae-a65a-0a50b6f8fe92n%40googlegroups.com?utm_medium=email&utm_source=footer> >>>>> . >>>>> >>>> -- >>> You received this message because you are subscribed to the Google >>> Groups "weewx-user" group. >>> To unsubscribe from this group and stop receiving emails from it, send >>> an email to [email protected]. >>> >> To view this discussion visit >>> https://groups.google.com/d/msgid/weewx-user/346dd346-60e0-4fc9-8083-ee1c6b58c8dfn%40googlegroups.com >>> >>> <https://groups.google.com/d/msgid/weewx-user/346dd346-60e0-4fc9-8083-ee1c6b58c8dfn%40googlegroups.com?utm_medium=email&utm_source=footer> >>> . >>> >> >> -- You received this message because you are subscribed to the Google Groups "weewx-user" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To view this discussion visit https://groups.google.com/d/msgid/weewx-user/e56ce381-582f-4b02-b5f0-b66e636d08c7n%40googlegroups.com.
