bash shell 中date时间戳的妙用

#!/bin/bash
time=`date +%F-%H-%M-%S`
log=import$time.log
cd /opt/saas/job/import 
touch log/$log
php index.php &>log/$log
#!/bin/bash
time=`date +%F-%H-%M-%S`
log=push$time.log
cd /opt/saas/job/import 
touch log/$log
php push.php &>log/$log

BASH 编程 — 项目文档
UPLOOKING Bash ——项目文档

BASH编程 — 项目文档

1、批量添加用户

1. 需求分析:
在系统管理工作中,有时需根据一些开发项目的需求、企业用户的迁移等,可
能需要大批量的添加用户,逐步手动添加是一件非常繁琐的事情,可能还会出现
很多错误,给公司的运转带来不必要的麻烦和经济上的损失。为了正确高效的完成
这类工作,这时候就需要根据实际情况编制shell脚本。

2.实现方法:
在添加用户、迁移用户时,需根据用户已有的一些设置或要求来完成添加和迁
移,可能存在下列情形:

a.用户名称各异;
b.用户的家目录已存在,甚至可能目录名称怪异与用户名不一致
c.密码已存在,用户不希望更改已有密码。
3.算法分析:
先把用户名和密码导出到一个普通的文本文件中,如果对新建用户的家目录有
要求可以在后面(第三列)给出用户的家目录具体的看下面说明了每列的含义
username password home group shell

a.先写文件锁,当脚本使用中让其他人不能更改脚本
b.参数选择项,-U,-P
c.判断文件是否存在。

d.应注意任何退出前删除LOCK文件
e.按列读取用户和密码文件,当用户为空时报错,密码为空时使用默认密码
4. 代码实现:
#!/bin/bash
LOCKfile=/root/test/useradd.LOCK
if [ -f “$LOCKfile” ]; then #判断锁文件是否存在
echo “LOCK file is exist” && exit
else
touch /root/test/useradd.LOCK
fi
while [ $# -gt 0 ] ; do #判断参数
case “$1” in
-u )
shift;

[ -f “$1” ] && USER_FILE=$1 ||
echo “USER_FILE not found” &&

rm -f $LOCKfile && exit

shift;;
-p )

shift;
[ -f “$1” ] && PASSWD_FILE=$1 ||
echo “PASSWD_FILE not found” &&

rm -f $LOCKfile && exit

shift;;

*
)
shift ;;
esac
done
userline=$(wc -l $USER_FILE|cut –d ‘

-f1) #获取user文件第一列行数值
passwdline=$(wc -l $PASSWD_FILE|cut –d ‘

-f1) #获取passwd文件第一列的

行数值
if [ $userline -eq$passwdline ];then
if [ “$userline” -eq
0 ] ||
[ “$passwdline” -eq
0 ]#对两个文件的判断
then
echo “USER_FILE or PASSWD_FILE is empty” && exit

else
sed -i ‘s/^$/PASSWD/’
/root/test/passwd.file
for line in `seq
1 $userline`

do
username=$(tail +$line $USER_FILE|head -1|awk
‘{
print $1 }’)
home=$(tail +$line $USER_FILE|head -1|awk
‘{
print $2 }’)
passwd=$(tail +$line $PASSWD_FILE|head -1)
if [ -z
“$home” ]

then
useradd $username

echo $passwd|passwd $username –stdin

else
useradd $username -d $home
echo $passwd|passwd $username –stdin

fi
done
fi
else

echo “userline != passwdline” && exit
fi
rm -f /root/test/useradd.LOCK

2、备份策略

1.需求分析:
如果你经历过硬盘损坏,你就知道多么痛苦。十分重要、无法替代的数据丢
失,你可能需要花上很长的时间去安装系统和应用程序。这绝不是什么有趣的历
程,这样的事情只需要一次,就足够让你意识到为你的关键数据进行常规备份
的重要性了,尤其对企业里的系统管理人员来说,这几乎是其日常工作最为重
要的一环!

2.实现方法:
a. 完全备份:
完全备份就是保存一个指定的磁盘或分区中的每个文件的备份方式,可
以用其恢复整个磁盘、分区甚至可以用来重建系统。但其存在明显的缺点,需
占用大量的磁盘空间和耗费大量的时间,这取决于你的系统的文件的使用频
率和你的设备的容量大小,可以每几个星期作一次,可以留到周末系统负荷
较低时再进行。

b.增量备份:
增量备份仅包含上一次完全备份实施后添加和修改过的文件。增量备份可节
省磁盘设备,相对完全备份,增量备份只需很少的时间去完成。
c. 差异备份:
差异备份用于复制自上次完全或增量备份以来所新建或修改过的文件。它不
将文件标记为已经备份(换句话说,没有清除存档属性)。这就是说,正常

或增量备份去掉了文件的 “存档”属性,在新文件创建或旧文件被修改后,
文件重新被加上了 “存档”属性,差异备份就是备份这类文件。在备份完毕
后,差异备份并不会清除这类文件的 “存档”属性,这样的话,在下次运行
差异备份的时候,只要在此期间上次差异备份的文件没有被更改,则它们还
会包含在备份集中,将被再次备份。(差异备份理解的不透彻,参考了他人
思路)

3.算法分析:
利用shell脚本和cron守护进程,可以自动执行备份工作。在脚本中通过tar命
令来完成文件备份,其优点是可以把很多文件、目录放在一个文件中,并且保留
ugo的权限,方便数据的恢复。
3.代码实现:
a. 完全备份
#!/bin/bash

DATADIR=/root/test/data

BAKDIR=/root/test/backup

DATE=`date +”%F-%H%M%S”`
#时间变量

find $DATADIR >
$BAKDIR/$DATE”.list” #生成文件列表

echo BACKUP BEGIN `date +”%F-%H%M%S”`
>>
/root/test/log

mkdir -p $BAKDIR/$DATE

tar -cf –T
$BAKDIR/$DATE”.list” |
tar -xf –C $BAKDIR/$DATE/ -v

index-file $BAKDIR/$DATE”.index” #使用tar命令备份表中的文件

cat $BAKDIR/$DATE”.index” >>
/root/test/log

echo BACKUP END
`date +”%F-%H%M%S”`
>>
/root/test/log

echo -e “\n\n\n” >>
/root/test/log

b.增量备份
#!/bin/bash

DATE=`date +”%F-%H%M%S”`

BAKDIR=/root/test/backup

DATADIR=/root/test/data

LASTLIST=`ls /root/test/backup/*.list|sort|tail -n1`

find $DATADIR >
$BAKDIR/$DATE”.list”

find $DATADIR -newer $LASTLIST
>
$BAKDIR”/up.lst” #生成增量文件备份列

mkdir -p $BAKDIR/$DATE

echo BEGIN BACKUP `date +”%F-%H%M%S”`
>>
/root/test/log

tar -cf –T
$BAKDIR/up.lst |
tar -xf –C $BAKDIR/$DATE/ -v

index-file $BAKDIR/$DATE”.index” #使用tar命令备

份表中的文件

cat $BAKDIR/$DATE”.index” >>
/root/test/log

echo END
BACKUP `date +”%F-%H%M%S”`
>>
/root/test/log

echo -e “\n\n\n” >>
/root/test/log

c. 差异备份
for newpath in `cat $BAKDIR”/up.lst”`

do

tobereplace=$(
cat $BAKDIR/list |
grep $newpath )

tobereplacerwx=$(
cat $BAKDIR/rwx.lst |
grep $newpath )

new=$(cat $BAKDIR/list|grep $newpath|awk
‘{print $1″

‘$BAKDIR/$DATE'”}’)

rwx=$(ls -l $newpath |
awk
‘{
print $1 }’)

rwxfull=$(cat $BAKDIR/rwx.lst|grep $newpath|awk
‘{print $1″ :
‘$rwx'”}’)

if [ -z
“$tobereplace” ]

then

echo $newpath $BAKDIR/$DATE >>
$BAKDIR/list

echo $newpath :
$rwx >>
$BAKDIR/rwx.lst

else

oldpath=$(cat $BAKDIR/list|grep $newpath|awk
‘{print $2″‘$newpath'”}’)

sed -i “s#$tobereplace#$new#” $BAKDIR/list

path=$(cat $BAKDIR/list|grep $newpath|awk
‘{print $2″‘$newpath'”}’)

diff $oldpath $path >
/foo/bar/diff_file

sed -i “s#$tobereplacerwx#$rwxfull#” $BAKDIR/rwx.lst

fi

done

echo `diff $LASTLIST
$BAKDIR/$DATE”.list”|egrep ‘^<'|awk '{print }'` has deleted >>
/foo/bar/log

3、远程备份

1.需求分析:
为网络内的多台机器共享一台备份设备,比起为网络中的每个系统安装设置
一个备份设备,这种方法更经济更方便。前面的备份方式都可以通过远程网络来进行,
备份到网络中的共享备份设备上。

2.实现方法:共享的备份设备设定为文件服务器,客户机器进行远程备份时使用
key
ssh远程登录到,结合使用scp和文件锁实现无干扰情况下的文件拷贝操作。
3.代码实现:
#!/bin/bash
LOCK=/tmp/LOCK
ERRLOCK=11
a=0

if [ -f $LOCK ]

then
while [ a -eq
3 ]
do
if [ -f $ LOCK ]

then
sleep 15
a=a+1
else
break;

fi
done
exit

echo error$ERRLOCK
cp /putdir/pub/*
/www/pub/
rm $LOCK

#!/bin/bash
LOCKLOCK=/tmp/LOCK
touch $LOCK
ERRLOCK=11
ssh apache ls $LOCK
if[0-eq$?]then :;

else exit $ERRLOCK;fi
ssh apache touch $LOCK
scp /cmsdir/file/*
x.x.x:/putdir/pub#目标位置
rm $LOCK
ssh apache rm $LOCK

4、 rsync备份

1.需求分析:如果你经历了重大的磁盘崩溃事件,那么进行备份的努力哪怕是进行
了许多次也是值得的,如果不擅长shell脚本,那么怎么实现数据的及时高效的
备份呢?
2.实现方法:利用rs ync这个工具结合ssh和 cron可以实现多次数据的备份。
Rsync可以轻松实现完全和增量备份。
3.代码实现:
#!/bin/bash
LOCK=/tmp/lock
touch $LOCK
ERRLOCK=11
if [ -f $lock] ; then
exit echo $ERRLOCK;
fi
/usr/bin/rsync –
zrtpogv
–delete –password-file= /etc/rsyncd.passwd

user@x.x.x.x:
\
/home/backupdir
rm $lockLOCK

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据