前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >shell脚本实例

shell脚本实例

作者头像
恋喵大鲤鱼
发布2018-08-03 14:34:46
1.2K0
发布2018-08-03 14:34:46
举报
文章被收录于专栏:C/C++基础

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

检测脚本如下:

代码语言:javascript
复制
#!/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。

代码语言:javascript
复制
*/1 * * * * /home/lvlv/check_alive.sh >/dev/null 2>&1

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

代码语言:javascript
复制
0 6 * * * echo "Good morning"

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

代码语言:javascript
复制
0 6 * * * echo “Good morning.” >> /tmp/test.txt

2.shell中执行MySQL语句

以函数的形式实现如下:

代码语言:javascript
复制
#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编程中变量含有星号*,被解释成当前目录下的文件列表,容易出现如下错误:

代码语言:javascript
复制
sql="select * from mytable"
echo "execute sql =" ${sql}

输出结果是:

代码语言:javascript
复制
execute sql = select lvlvtest.sh test.txt from mytable 

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

代码语言:javascript
复制
"${sql}"

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

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

代码语言:javascript
复制
# 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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016年06月27日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.定时检测进程是否挂掉,若挂掉则重启(拉起)
  • 2.shell中执行MySQL语句
  • 3.shell中通过awk获取指定行指定列的数据
  • 参考文献
  • 参考文献
相关产品与服务
云数据库 MySQL
腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档