While I use MariaDB and create hot DB backups, for small databases like weewx, there is nothing wrong with a cold backup (where the database is stopped, backed up and started up).

---
pablo


On 2026-09-21 22:59, 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/16ac4e60-f759-4d2a-bd74-57e406fb552fn%40googlegroups.com <https://groups.google.com/d/msgid/weewx-user/16ac4e60-f759-4d2a-bd74-57e406fb552fn%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/67ad4eba-acfb-4fc4-b433-27471d0de5e7%40hillsandlakes.com.

Reply via email to