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.

Reply via email to