ubuntu开机自启动,设置定时任务脚本

本文详述了在Linux环境下,如何批量设置定时任务和开机自启动脚本来确保业务程序的稳定运行。针对定时任务的创建,通过shell脚本检查并添加到crontab,解决了因相对路径导致的问题。对于开机启动,讨论了不同类型的启动任务,并选择了修改rc.local文件以实现无人登录时也能启动程序。最终,通过脚本自动化处理rc.local文件,确保了程序开机自动运行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

项目场景:

最近工作需求要对我们的业务程序进行监控和保护,保证如果程序宕机或者机器重启的情况下程序能够尽快自动恢复运行。


问题描述

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值