[实践OK]用crontab每半秒或者几秒执行一个命令,踩坑记录-crontab每10秒执行一次。

jackxiang 2011-5-27 23:38 | |
问题:rontab里最小的时间单位是分钟,我用*/120,想让每半分钟执行一次,也不行啊。



比如同步:






/data/htdocs/t.jackxiang.com/shell/getNowTempValueFromCom.sh

/usr/bin/php /data/htdocs/t.jackxiang.com/getNowTempValueFromCom.php
简单实现让一个进程去读取串口的操作,这样通过循环读取出来的数据值也就更快更准,否则多个去读容易读乱了,主要是用的while去循环读取这块要是c可能select去操作:











回答:我想应该是不行的,因为 cron 每分钟才读一次配置文件,看哪些命令要执行,精度应该不能再高了。
有没有其他的解决方案:
这种思路挺巧妙的
但为什么不设置成开机后就启动这个脚本,然后在脚本里面控制间隔呢。
换个思路如下:
方法1:
两个脚本
1个正常,一个sleep30
crontab设置同时启动,想到的只有这个办法了

让其中一个脚本睡眠30秒,另一个正常运行
举例
a.sh是你的脚本
再写一个b.sh
内容如下:
  sleep 30
   a.sh
然后在cron中把这两个脚本都加进去,设置一样的启动条件(分钟是*)

shell知识:
在有的shell(比如linux中的bash)中sleep还支持睡眠(分,小时)
sleep 1    睡眠1秒
sleep 1s    睡眠1秒
sleep 1m   睡眠1分
sleep 1h   睡眠1小时
方法2:
TenSecend.sh


方法3:
* * * * * cmd
* * * * * (sleep 10 && cmd)
* * * * * (sleep 20 && cmd)
* * * * * (sleep 30 && cmd)
* * * * * (sleep 40 && cmd)
* * * * * (sleep 50 && cmd)
这样就可以了,这是个简单的问题,而我没有在Jackxiang上得到答案,看来绝对是我描述问题的方法有问题.  下次定要记得把问题说清楚,这样各位朋友才好帮到我,呵呵~

你可以不停的使用
at
batch

不过得保证10秒程序执行完。







=====================踩坑记录-crontab每10秒执行一次==================================
写在前面,记录一个linux小白使用crontab中遇到的各种坑及解决思路方法。网上帖子千千万,坑也是千千万。记录下,分享给大家。
需求:linux中使用crontab每十秒执行一次
场景:需要在ubuntu14服务器中使用代理每十秒执行一次curl来访问互联网,来测试代理网络稳定性。
经过网上的大量搜贴之后得到的可用的一个结论如下:
# crontab -e
* * * * * /usr/local/cc.sh >>/usr/local/log.txt 2>&1
* * * * * sleep 10; /usr/local/cc.sh >>/usr/local/log.txt 2>&1
* * * * * sleep 20; /usr/local/cc.sh >>/usr/local/log.txt 2>&1
* * * * * sleep 30; /usr/local/cc.sh >>/usr/local/log.txt 2>&1
* * * * * sleep 40; /usr/local/cc.sh >>/usr/local/log.txt 2>&1
* * * * * sleep 50; /usr/local/cc.sh >>/usr/local/log.txt 2>&1
如果你是直接一梭子全复制,改下目录那么恭喜你完成了计划任务。而我就不是了,我只写了sleep 10 这条然后任务没有执行。这就是坑。

坑1 .上面sleep 10 20 30 ...是啥意思啊,怎么个规则啊。一头雾水,当时我是直接把第二个sleep 10 那个定时任务直接粘进去的。然后,任务没有执行就一直纠结任务没有执行这个问题。
坑2.ubuntu系统第一次使用crontab -e 需要选择比编辑器,如果选nano上,对我这种小白可就蒙圈。最后在命令行使用, select-ediort 来选择编辑器选3 vim 就好了
后来,明白后做了实验。
如果只写前两条的话是:在每分钟的第一秒和第一个10秒执行一次
* * * * * /usr/local/cc.sh >>/usr/local/log.txt 2>&1
* * * * * sleep 10; /usr/local/cc.sh >>/usr/local/log.txt 2>&1


以此类推只写前三的话就是:在每分钟的第一、第一个十秒、第二个十秒分别执行一次
* * * * * /usr/local/cc.sh >>/usr/local/log.txt 2>&1
* * * * * sleep 10; /usr/local/cc.sh >>/usr/local/log.txt 2>&1
* * * * * sleep 20; /usr/local/cc.sh >>/usr/local/log.txt 2>&1
如果都写上的话就是每十秒执行一次啦,完美过程。

过程遇到的问题(1):crontab -e 完都有新邮件

原因:1.crontab 每次执行完程序产生的输出都会发邮件到/var/mail/root
2.定时任务语法有误,/var/mail/root  发送的是错误日志,如下

root@bogon:/usr/local# tail -20 /var/mail/root
From root@bogon  Tue May 21 18:31:11 2019
Return-Path: <root@bogon>
X-Original-To: root
Delivered-To: root@bogon
Received: by bogon (Postfix, from userid 0)
  id AAFCB43077; Tue, 21 May 2019 18:31:11 +0800 (CST)
From: root@bogon (Cron Daemon)
To: root@bogon
Subject: Cron <root@bogon> sleep 10; sh /home/liuxin/curl-status.sh >dev/null 2>&1
Content-Type: text/plain; charset=ANSI_X3.4-1968
X-Cron-Env: <SHELL=/bin/sh>
X-Cron-Env: <HOME=/root>
X-Cron-Env: <PATH=/usr/bin:/bin>
X-Cron-Env: <LOGNAME=root>
Message-Id: <20190521103111.AAFCB43077@bogon>
Date: Tue, 21 May 2019 18:31:11 +0800 (CST)

/bin/sh: 1: cannot create dev/null: Directory nonexistent

解决:如果是1的话就放到黑洞  >/dev/null 2>&1
* * * * * /usr/local/cc.sh >/dev/null 2>&1
精讲:1,/dev/null是linux系统的一个垃圾桶(一个不正经的比喻)有不用的输出都可以往里面扔。>/dev/null 缺省默认是1 即 1>/dev/null
2,linux中有三种标准输入输出,分别是STDIN,STDOUT,STDERR,对应的数字是0,1,2    2>&1就是把2错误输出重定向到1标准输出  而1又输出到/dev/null黑洞
如果不想输出到一个文件可以这样写
* * * * * /usr/local/cc.sh >>/usr/local/log.txt 2>&1
过程中遇到的问题(2):如图crontab -e 后是新文件

解决:crontab语法错误再三检查后,建议select-editor 选3  vim

来自:https://mp.weixin.qq.com/s/CoWxVO5wlsJcIhv9a8sdKQ

作者:jackxiang@向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除
地址:http://jackxiang.com/post/4331/
版权所有。转载时必须以链接形式注明作者和原始出处及本声明!


最后编辑: jackxiang 编辑于2019-5-28 16:55
评论列表
发表评论

昵称

网址

电邮

打开HTML 打开UBB 打开表情 隐藏 记住我 [登入] [注册]