项目场景:
最近工作需求要对我们的业务程序进行监控和保护,保证如果程序宕机或者机器重启的情况下程序能够尽快自动恢复运行。
问题描述
1.对多台机器批量添加定时任务,定时运行业务程序监控脚本。
2.对多台机器批量添加开机自启动任务,在机器重启后自动运行业务程序。
这篇记录的关注点主要在于添加定时任务和自启动任务的一些坑,批量添加的部分会少提一下。
1.定时任务设置
老生常谈的问题了,这里直接上脚本
#!/bin/bash
timeinterval=5
myscript=monitor.sh
filePath="mypath"
echo $filePath
#下面这句把定时任务输出到临时文件里,方便我们修改
crontab -l > cron
#在临时文件里查找是否已经有这个定时任务了
number=`grep -n "$myscript" cron | cut -d ":" -f 1`
aa=$number
echo $aa
#如果查找出的字符串长度为0
if [ -z $aa ];
then
echo "该任务不存在,将添加"
echo '*/'$timeinterval' * * * * '$filePath'/'$myscript'' >> cron
#用临时文件更新定时任务
crontab cron
rm -f cron
else
echo "该任务已经存在"
#把已有的任务删除掉,重新添加
sed -i '/'$myscript'/d' cron
echo '*/'$timeinterval' * * * * /bin/bash' $filePath'/'$myscript'' >> cron
crontab cron
rm -f cron
fi
echo "done"
这个脚本也不是我原创的,这里贴出原作者地址,以及一些解释crontab比较清楚的文章:
1.linux 脚本设置定时,脚本添加定时任务(Linux)
https://blog.youkuaiyun.com/weixin_39999025/article/details/116629702
2.crontab 没有立即生效原因,crontab重启
https://www.cnblogs.com/wjq310/articles/6737432.html
3.Ubuntu14.04下创建定时任务
https://blog.youkuaiyun.com/u014663232/article/details/103900985
这个脚本写好以后呢,我就很愉快的批量发送了。然而我发现他并没有奏效。手动运行监控脚本完全没问题,但是定时任务就是没反应。百度了一下(就是2号文章,感谢那位大神!),查看/var/log/message 日志,发现crontab有执行,但是却没结果。原因是我的监控脚本里有一步进入路径的操作写的是相对路径。这里一定要改成绝对路径才能够正常运行。
开机自启动任务:
开机自启动其实有很多中方法,这里介绍两种,一种是通过ubuntu的startupApplication设置。这个是有图形化界面的。但是有的时候即使设置了程序也不能正常启动。这里主要介绍一下我收集到的一些细节。
startupApplication里的开机启动项实际上是在/usr/share/application或者/etc/xdg/autostart里建了一个desktop文件,里记录了你想要启动的程序或者脚本。
系统自带的服务基本上在/etc/xdg/autostart这里,你自己新建的在/usr/share/application。
你可以自己选择是通过终端指令修改开机任务的属性或者通过图形化界面来修改。
但要注意的是,在这里/usr/share/application设置的开机自启动任务是在登录桌面后才会启动的
。也就是说如果你机器是开机状态,但没有人登录到桌面,他也不会启动。这里就涉及到Ubuntu启动项的分类:
第一类upstart,或者叫job,由init管理,配置文件目录/etc/init,~/.init
第二类叫service,由rc.d管理,配置文件目录/etc/init.d,以及/etc/rc.local文件
第三类叫cron,由contab管理,使用crontab进行配置
第四类叫startup,由xdg管理,配置文件目录/etc/xdg/autostart,以及
~/.config/autostart
upstart任务适用于runlevel<5的脚本和程序,service任务适用于runlevel<=5的任务,cron任务则不一定,而startup一般工作在runlevel=5,也就是桌面级。
对于普通用户而言,你的桌面级应用应该使用startup,服务级应用(比如某些功能性的软件脚本)应该使用service,常规性配置可以使用cron,而与启动顺序有关的最好使用upstart。
引自:
https://www.likecs.com/show-203316373.html
我的需求是只要机器启动了,程序就要开始运行,即使无人登录桌面也必须正常跑。所以显然startupApplication不能满足我的需求,因此最终决定通过脚本来修改rc.local文件。
#!/bin/bash
myscript=myprogram.sh
filePath=mypath
echo $filePath
#同样的思路,把rc.local文件导出到临时文件
cat /etc/rc.local> rclocal.tmp
number=`grep -n "$myscript" rclocal.tmp | cut -d ":" -f 1`
aa=$number
echo $aa
if [ -z $aa ];
then
echo "该任务不存在,将添加"
sed -i '/exit 0/d' rclocal.tmp
echo '/bin/bash '$filePath'/'$myscript >> rclocal.tmp
#任务一定要写在exit 0之前
echo 'exit 0' >> rclocal.tmp
sudo cp rclocal.tmp /etc/rc.local
chmod +x /etc/rc.local
chmod 755 /etc/rc.local
rm -f rclocal.tmp
else
echo "该任务已经存在"
# sed -i '/'$myscript'/d' rclocal.tmp
# sed -i '/exit 0/d' rclocal.tmp
#crontab cron
rm -f rclocal.tmp
fi
echo "done"
注意这个脚本要用sudo来运行,不然没有权限修改rc.local文件。
最后提一句关于批量发送运行,主要是用到了expect工具。这里不赘述了。
关于rc.local如何修改的文章:
Linux Ubuntu 20.04 —添加开机启动(服务/脚本)
https://www.cnblogs.com/netflix/p/15035618.html