检测脚本如下:
#!/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
以函数的形式实现如下:
#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}"
获取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