Shell Script help for backup
Hey all,
I'm thinkin' maybe I should post this in a shell scripting group but
thought someone here may be able to help me out...
I'm lookin' to run a shell script through the crontab on a nightly
basis for backup, and not keep more than a week of backups. In those
terms, I have a script working.
But I wanna take the script to another level. Basically, I want it to
email me if pg_dump fails, but I'm having a hard time doing so.
here's what I got
#!/bin/bash
DATE=`date +%Y-%m-%d`
PGUSER=<my username>
PGPASSWORD=<my password>
export PGUSER PGPASSWORD
pg_dump <dbname> | gzip > /folder/pg_backup.$DATE.gzip
if [ !$? ]
then
find /folder/pg_backup/* -mtime 8 -exec rm -f {} \;
echo "The PostGreSQL backup for today completed successfully" | mail
ratlhead@ratlhead.com
else
echo "The PostGreSQL backup for today was unsuccessful" | mail
ratlhead@ratlhead.com
fi
The problem is that is always gets detected as being successful, even
if I say, comment out the export line of my user/pass. Any
suggestions on how I can detect whether or not it worked?
Something else I'll be lookin' to do is FTP'ing the backup to another
server. If anyone has suggestions on where I can look for help on
that, it'd be great.
Thanks!
On Sat, Jul 20, 2002 at 02:25:48AM -0700, ratlhead wrote:
#!/bin/bash
DATE=`date +%Y-%m-%d`
PGUSER=<my username>
PGPASSWORD=<my password>
export PGUSER PGPASSWORD
pg_dump <dbname> | gzip > /folder/pg_backup.$DATE.gzip
if [ !$? ]
then
find /folder/pg_backup/* -mtime 8 -exec rm -f {} \;
echo "The PostGreSQL backup for today completed successfully" | mail
ratlhead@ratlhead.com
else
echo "The PostGreSQL backup for today was unsuccessful" | mail
ratlhead@ratlhead.com
fiThe problem is that is always gets detected as being successful, even
if I say, comment out the export line of my user/pass. Any
suggestions on how I can detect whether or not it worked?
The script always detects a successful dump because the last command in
the pipe is gzip and it always succeeds.
You could change the [ !$? ] to something like:
[ "$( zcat /folder/pg_backup.$DATE.gzip | head -c1 | wc -c )" -eq 1 ]
Something else I'll be lookin' to do is FTP'ing the backup to another
server. If anyone has suggestions on where I can look for help on
that, it'd be great.
Use ncftpput or scp with no passphrase.
Regards,
Luciano Rocha
--
Consciousness: that annoying time between naps.
You don't have to compromise and use a clear passphrase, you can use
keychain, this uses ssh-agent and caches the user's passphrases:
http://www-106.ibm.com/developerworks/library/l-keyc2/
-----Original Message-----
From: strange@nsk.yi.org [mailto:strange@nsk.yi.org]
Sent: 22 July 2002 15:09
To: pgsql-general@postgresql.org
Subject: Re: [GENERAL] Shell Script help for backup
On Sat, Jul 20, 2002 at 02:25:48AM -0700, ratlhead wrote:
#!/bin/bash
DATE=`date +%Y-%m-%d`
PGUSER=<my username>
PGPASSWORD=<my password>
export PGUSER PGPASSWORD
pg_dump <dbname> | gzip > /folder/pg_backup.$DATE.gzip
if [ !$? ]
then
find /folder/pg_backup/* -mtime 8 -exec rm -f {} \;
echo "The PostGreSQL backup for today completed successfully" | mail
ratlhead@ratlhead.com
else
echo "The PostGreSQL backup for today was unsuccessful" | mail
ratlhead@ratlhead.com
fiThe problem is that is always gets detected as being successful, even
if I say, comment out the export line of my user/pass. Any
suggestions on how I can detect whether or not it worked?
The script always detects a successful dump because the last command in
the pipe is gzip and it always succeeds.
You could change the [ !$? ] to something like:
[ "$( zcat /folder/pg_backup.$DATE.gzip | head -c1 | wc -c )" -eq 1 ]
Something else I'll be lookin' to do is FTP'ing the backup to another
server. If anyone has suggestions on where I can look for help on
that, it'd be great.
Use ncftpput or scp with no passphrase.
Regards,
Luciano Rocha
--
Consciousness: that annoying time between naps.
---------------------------(end of broadcast)---------------------------
TIP 6: Have you searched our list archives?
http://archives.postgresql.org
Mae�r neges e-bost hon ac unrhyw ffeiliau sydd ynghlwm wrthi yn gwbl gyfrinachol ac wedi�u bwriadu at sylw yr unigolyn neu�r endid y maent wedi eu cyfeirio ato yn unig. Gallant gynnwys gwybodaeth sy�n freintiedig yn gyfreithiol a/neu�n gyfrinachol ac os nad chi yw�r sawl y cyfeiriwyd y neges ato, yna peidiwch � chopio, dosbarthu na chymryd unrhyw gamau o ganlyniad a gan ddibynnu arni. Os ydych wedi derbyn y neges e-bost hon ar gam, a wnewch chi ein hysbysu o hyn cyn gynted � phosib a�i dileu os gwelwch yn dda. Barn neu safbwyntiau�r awdur yw�r rhai a fynegir yn y neges e-bost hon ac/neu�n unrhyw atodiadau ac nid ydynt yn adlewyrchu o anghenraid barn neu safbwyntiau S4C.
This e-mail message and any files attached are strictly confidential and intended solely for the attention of the person or entity to whom they are addressed. They may contain legally privileged and/or confidential information and if you are not the addressee, you should not copy, distribute nor take any action in reliance on them. If you have received this e-mail message in error, please notify us as soon as possible and delete it. The views and opinions expressed in this e-mail message and any attachments are the author�s own and they do not reflect necessarily the views and opinions of S4C.
Import Notes
Resolved by subject fallback
Hi all,
This is how I ended up solving my problem. Not sure if any of this
will help you, but here's the scripts I use. This is what it does...
-Uses PG environmental variables to connect to the PG server
-Dumps the specified database
-Checks the backup folder for any backups older than a week and
deletes those
-Checks to be sure the backup was successful by checking for a 0k file
for that day
-Sends email saying if backup was successful or failed
-If successful, checks the day and if it's Saturday, uploads most
current backup to specified ftp site
-.netrc file required for FTP connection
##### pg_backup.sh #####
#!/bin/bash
DATE=`date +%Y-%m-%d`
PGUSER=<my user>
PGPASSWORD=<my pass>
export PGUSER PGPASSWORD
/path/pg_dump <db name> | gzip > /path/pg_backup.$DATE.gzip
find /path/pg_backup/* -mtime 7 -exec rm -f {} \;
if test -s /path/pg_backup/pg_backup.$DATE.gzip
then
echo "The PostGreSQL backup for today was successful!" | mailx -s
"PostGreSQ
L backup successful" <email address>
/path/day_pg.sh
else
echo "The PostGreSQL backup for today failed!" | mail -s
"PostGreSQL backup
failed" <email address>
fi
##### day_pg.sh #####
DAY=`date +%a`
if [ $DAY = "Sat" ]
then
/path/upload_pg.sh
fi
##### upload_pg #####
DATE=`date +%Y-%m-%d`
ftp <host> << EOF
cd path
put /path/pg_backup.$DATE.gzip pg_backup.$DATE.gzip
quit
EOF
##### .netrc #####
machine <host> login <username> password <password>
-Mike Graben
ratlhead@ratlhead.com
On Mon, Jul 22, 2002 at 03:35:01PM -0700, ratlhead wrote:
Hi all,
This is how I ended up solving my problem. Not sure if any of this
will help you, but here's the scripts I use. This is what it does...-Uses PG environmental variables to connect to the PG server
-Dumps the specified database
-Checks the backup folder for any backups older than a week and
deletes those
-Checks to be sure the backup was successful by checking for a 0k file
for that day
What's wrong with the solution I sent?
And I doubt the checking for a 0k file will work for you as gzip will
create a 20 byte file even for a 0 byte input (some headers, etc.).
Regards,
Luciano Rocha
--
Consciousness: that annoying time between naps.
strange@nsk.yi.org wrote in message news:<20020723150902.A5173@nsk.yi.org>...
What's wrong with the solution I sent?
And I doubt the checking for a 0k file will work for you as gzip will
create a 20 byte file even for a 0 byte input (some headers, etc.).Regards,
Luciano Rocha
Luciano,
Was wondering if you could provide some help with the solution you
sent...
[ "$( zcat /folder/pg_backup.$DATE.gzip | head -c1 | wc -c )" -eq 1 ]
First, I can't seem to use zcat, because it likes to add on a ".Z" to
the filename for some reason or another. Also, I find with the
version of 'head' installed on my machine, that -c isn't available,
but instead, -n. I tried changing that and zcat to cat, but was
getting a fail on something that should be valid.
This basically checks to see if the file contains data right?
Thanks man!
You can do 'zcat < file' to prevent the *.Z requirement. Yes, head -n
should work fine.
---------------------------------------------------------------------------
ratlhead wrote:
strange@nsk.yi.org wrote in message news:<20020723150902.A5173@nsk.yi.org>...
What's wrong with the solution I sent?
And I doubt the checking for a 0k file will work for you as gzip will
create a 20 byte file even for a 0 byte input (some headers, etc.).Regards,
Luciano RochaLuciano,
Was wondering if you could provide some help with the solution you
sent...[ "$( zcat /folder/pg_backup.$DATE.gzip | head -c1 | wc -c )" -eq 1 ]
First, I can't seem to use zcat, because it likes to add on a ".Z" to
the filename for some reason or another. Also, I find with the
version of 'head' installed on my machine, that -c isn't available,
but instead, -n. I tried changing that and zcat to cat, but was
getting a fail on something that should be valid.This basically checks to see if the file contains data right?
Thanks man!
---------------------------(end of broadcast)---------------------------
TIP 6: Have you searched our list archives?
--
Bruce Momjian | http://candle.pha.pa.us
pgman@candle.pha.pa.us | (610) 853-3000
+ If your life is a hard drive, | 830 Blythe Avenue
+ Christ can be your backup. | Drexel Hill, Pennsylvania 19026
On Sun, Jul 28, 2002 at 11:22:22PM -0400, Bruce Momjian wrote:
You can do 'zcat < file' to prevent the *.Z requirement. Yes, head -n
should work fine.
Hm... I missed the other email, so I'm replying to this:
The "$( zcat /folder/pg_backup.$DATE.gzip | head -c1 | wc -c )" is to
check if there are any bytes stored in the gzip file.
If the zcat expects an .Z file, try with gzcat file, gzcat < file, or
gzip -d < file.
head -c1 is meant to stop the decompression at the first byte, I didn't
want it to wait until full decompression of the gzipped file, and I didn't
use -n because then it would depend on the internal format of the
decompressed file (if it was a binary file, a newline could appear only
after quite some time).
If you're going to use head -n1, then change the test to:
[ "$( gzip -d < /folder/pg_backup.$DATE.gzip | head -n1 | wc -c )" -ge 1 ]
(ie, instead of checking if bytes == 1, check if bytes >= 1).
Regards,
Luciano Rocha
--
Consciousness: that annoying time between naps.