shell脚本实例

1.定时检测进程是否挂掉,若挂掉则重启(拉起)

检测脚本如下:

#!/bin/sh 
PATH=/usr/local/mysql/bin:/usr/local/bin:/bin:/usr/bin:/bin:/sbin

ALARM_BIN="/home/oicq/tools/uniform_msg_client"
PhoneNo="15892765091"
LOCAL_IP=`ifconfig eth1|grep "inet addr"|awk '{printf("%s\n", $2)}'|awk -F: '{printf("%s", $2)}'`

TARGET="InviteJoinGrpFlt"
TARGET_Dir="/home/lvlv"
echo `ps -ef|grep "\b${LOGIN_TARGET}\b"|grep -v grep|awk '{printf $0}'`
login_result=`ps -ef|grep "\b${LOGIN_TARGET}\b"|grep -v grep|awk '{printf $2}'`

if [ -z "$login_result" ]
then
    echo "2 login_result: $login_result"
    echo "$login_result"
    ulimit -c 20000
    cd ${TARGET_Dir}
    ./${TARGET}
    echo `date` "restart ${LOGIN_TARGET}">> /home/log/restart.log
    ${ALARM_BIN} sms -T ${PhoneNo} -c "${LOCAL_IP} ${LOGIN_TARGET} restart "
fi
echo "$login_result"

上面是用于检查某个指定程序是否挂掉,若挂掉则重启,并发送短信通知到指定的手机。

检查脚本书写完成后,需要crontab来定期执行该脚本,意在每隔多长时间去检测一次。crontab命令选项如下:

-u [user]:用来设定某个用户的crontab服务,例如,“-u lvlv”表示设定lvlv用户的crontab服务,此参数一般有root用户来运行。

file:file是命令文件的名字,表示将file做为crontab的任务列表文件并载入crontab。如果在命令行中没有指定这个文件,crontab命令将接受标准输入(键盘)上键入的命令,并将它们载入crontab文件。

-e:编辑某个用户的crontab文件内容。如果不指定用户,则表示编辑当前用户的crontab文件。

-l:显示某个用户的crontab文件内容,如果不指定用户,则表示显示当前用户的crontab文件内容。

-r:从/var/spool/cron目录中删除某个用户的crontab文件,如果不指定用户,则默认删除当前用户的crontab文件。

-i:在删除用户的crontab文件时给确认提示。

每个用户的crontab文件存储在/var/spool/cron目录下的各自用户名的文件夹中,这个文件是不可以直接编辑的,只可以用crontab -e 来编辑。系统的cron服务启动后每过一分钟读一次这个文件,检查是否要执行里面的命令。因此此文件修改后不需要重新启动cron服务并且crontab定时任务的最小时间粒度只能是一分钟,如果想缩短,只能在代码中实现。

crontab文件的含义:
用户所建立的crontab文件中,每一行都代表一项任务,每行的每个字段代表一项设置,它的格式共分为六个字段,前五段是时间设定段,第六段是要执行的命令段,格式如下:
minute hour day month week command

其中:
minute: 表示分钟,可以是从0到59之间的任何整数。
hour:表示小时,可以是从0到23之间的任何整数。
day:表示日期,可以是从1到31之间的任何整数。
month:表示月份,可以是从1到12之间的任何整数。
week:表示星期几,可以是从0到7之间的任何整数,这里的0或7代表星期日。
command:要执行的命令,可以是系统命令,也可以是自己编写的脚本文件。

于是我们使用crontab -e 在crontab文件中加入如下一行语句,来完成每隔一分钟执行一次上面的检测脚本check_alive.sh。

*/1 * * * * /home/lvlv/check_alive.sh >/dev/null 2>&1

这里要注意两点:
(1)crontab中的用户自定义命令需要使用绝对路径,否则无法执行。当然系统命令无需使用绝对路径;
(2)crontab中的任何输出都不会输出到屏幕。比如:

0 6 * * * echo "Good morning"

注意:单纯echo,从屏幕上看不到任何输出,因为cron把任何输出都email到root的信箱了,可以把这个输出重定向到另外一个文件中,比如说重定向输出到一个txt文件中,你就可以看到了。

0 6 * * * echo “Good morning.” >> /tmp/test.txt

2.shell中执行MySQL语句

以函数的形式实现如下:

#run sql statement
function runsql(){
    dbUserName="-uroot"
    dbPwd="-proot@mysql"
    dbName="inv_join_grp"
    dbContext="${dbUserName} ${dbPwd} ${dbName}"
    echo $*|mysql ${dbContext};
}

#使用示例
runsql [u sql statement]

runsql "select * from myTableName"

这里需要注意一点,shell编程中变量含有星号*,被解释成当前目录下的文件列表,容易出现如下错误:

sql="select * from mytable" echo "execute sql =" ${sql}

输出结果是:

execute sql = select lvlvtest.sh test.txt from mytable 

很明显,shell把*解析成了当前目录文件的列表。如果和shell将*星号不进行替换呢,我们可以把变量有用双引号”“引起来。

"${sql}"

3.shell中通过awk获取指定行指定列的数据

获取1.txt中第二行第三列的数据,输出到2.txt。

# cat 1.txt
1 2 3
4 5 6
7 8 9
# cat 1.txt|awk 'NR==2{print $3}' > 2.txt
# cat 2.txt
6

因此,我们可以通过上面方法在shell中执行sql语句,并对sql语句执行的结果进行分区,获取我们从数据库中想要的数据!

参考文献

[1]shell编程中变量中含星号的处理
[2]

参考文献

[1]每天一个linux命令(50):crontab命令
[2]Linux cron、crontab计划任务、run-parts

你可能感兴趣的:(shell脚本实例)