需求说明:
N1盒子的armbian系统配置好了 ipv6 的ddns,实现了域名访问本机,但是本地ipv6可能会发生变化,当发生变化后,需要手动执行指令,将新的ip与域名绑定,现在我们采用定时任务,每1分钟执行一次命令,这样,当本地的ip6地址发生变化后,1分钟内就能自动绑定。
下载DDNS-master,放到 /usr/local/src 目录下并解压 ,这个目录专门用来放本地手动安装的应用。
具体步骤及配置文件见单独文章:
实现步骤
DDNS手动执行更新的命令是在DDNS-master目录下执行:python3 ./run.py 或 python3 run.py
现在,我们将需要将这个执行命令,放到 crontab 里面,让程序自动执行,并且每次执行写到日志里面,方便查看。
具体如下:
新建一个文件:touch ddns.sh
赋可执行权限:chmod +x ddns.sh (或者chmod 777 ddns.sh)
编辑器打开编辑文件:nano ddns.sh 或者 vim ddns.sh
将需要执行等具体指令输入到这个文件中,如下:
#!/usr/bin/env bash
python3 ./run.py && echo "run.py文执行了"
然后 crontab -e 进入crontab编辑器,如下:
输入如下:
过几分钟中,到 /tmp 目录下查看 ddns.log2有没有更新,如果有表示成功了,然后将猫路由器盒子都断电重启,重启后到阿里云后台查看域名解析的历史记录。
在文件里面加上日期,方便看日志
单引号和双引号的问题:
date +'%Y - %m -%d %H:%M:%S' 和 date +"%Y-%m-%d %H:%M:%S" 效果一样,效果如下:
ddns.sh文件最终如下:
#!/usr/bin/env bash
python3 ./run.py && echo "run.py被执行!执行时间:$(date +'%Y-%m-%d %H:%M:%S')"
最终效果:
定时自动删除日志
因为日志文件每分钟都会追加一条进去,所以文件会越来越大
所以我们需要定期删除这个文件
crontab -e 添加下面内容:
# 每日23点30分删除 ddns.log 这个文件
30 23 * * * rm /tmp/ddns.log
没执行成功1
直接写在crontab里面,不用单独创建一个文件,写法如下(没有成功):
* * * * * cd /usr/local/src/DDNS-master && bash run.sh && echo "定时任务执行了" >> /tmp/ddns.log4
没执行成功2
# 测试1
* * * * * /usr/bin/bash /usr/local/src/DDNS-master/auto-run.sh >> /tmp/ddns.log1
# 测试2
* * * * * bash /usr/local/src/DDNS-master/auto-run.sh >> /tmp/ddns.log2
没执行成功3
#!/usr/bin/env bash
python3 ./run.py && echo "run.py文执行了"
date +"执行时间:%Y-%m-%d %H:%M:%S"
没执行成功4
具体情况:日期未输出
原因:date 后面的日期变量缺少引号包起来
#!/usr/bin/env bash
python3 ./run.py && echo "run.py被执行!执行时间:$(date +%Y-%m-%d %H:%M:%S)"
拓展
echo用法
参考:Linux常用命令13 - echo - 知乎 (zhihu.com)
重定向到一个文件
您可以使用操作符将输出重定向 > 或者 >> 到一个文件,而不是显示在屏幕上。
如果 file.txt 不存在,命令将创建它。 当使用该文件时将被覆盖,而将把输出附加到该文件。
可以使用 cat 命令查看该文件内容:
echo -e 'The only true wisdom is in knowing you know nothing.\nSocrates' >> /tmp/file.txt
使用 $(command)表达式将命令输出包含在 echo 的参数中, 下面的命令将显示当前日期:
echo "The date is: $(date +%D)"
The date is: 04/01/20
echo
还可以显示变量。在下面的示例中,我们将输出当前登录用户的名称:
echo $USER
admin
crontab用法
【crontab的常用命令:crontab -e 编辑, crontab -l 查看】
【crontab 定时任务的常用规则: f1 f2 f3 f4 f5 program 】
f1 表示分钟,f2 表示小时,f3 表示一个月份中的第几日,f4 表示月份,f5 表示一个星期中的第几天,program 表示要执行的程序。
语法学习:
语法详解1:Linux Crontab 定时任务 | 菜鸟教程 (runoob.com)
语法详解2:linux 定时任务crontab用法详解 (51gjie.com)
参考案例:
*/5 * * * * /bin/echo "11" >> /tmp/test:每5分钟将“11”写入test文件
*/30 * * * * /usr/sbin/ntpdate 210.72.145.44 //每30分钟同步一下时间
* */1 * * * /usr/local/etc/rc.d/lighttpd restart //每一小时重启apache
我们现在的需要是:每隔10分钟执行一次 auto-run.sh 这个脚本,定时任务按照规则写出来就是:
*/10 * * * * /usr/bin/python3 /root/DDNS-master/run.py //每10分钟用python3执行run.py一次
* * * * * * "/usr/bin/python3 /root/DDNS-master/run.py" >> /tmp/ddns.log //每1分钟用python3执行run.py一次,并写入ddns.log这个日志里面。
我们先查看一下crontab里面现在的定时任务,执行 crontab -l 查看,如下:
root@armbian:~/DDNS-master# crontab -l
no crontab for root
执行 crontab -e 进行编辑,打开默认如下:
将我们上面的命令,敲上去,如下:
执行后出现错误,会自动进入编辑界面
经过检查发现,星号多了一个,应该是5个星号
将命令单独拿出来执行,提示没有config.json文件,自动又创建了一个,不知道创建到哪里了,于是使用查找命令,查找这个文件,如下:
root@armbian:~# find / -name config.json
/root/DDNS-master/config.json
/tmp/config.json