定时任务初体验

最近需要在服务器上配置一个定时任务,所以想着先在本地Mac环境上run起来。此处用的是cron定时任务,过程中也遇到了一些小问题,故特此记录梳理。

cron初印象

简而言之,cron是一个自定义定时器。常见于Unix和类Unix的操作系统中,用于设置周期性被执行的命令。Linux和Mac环境下对于cron的操作基本一致。cron一词源于希腊语time的前缀chron。

入门导向

  • cron和crontabcron是一个定时执行任务的守护进程。crontab是cron的配置文件或cron任务的列表。守护进程cron连续运行,每分钟检查一次配置文件中的修改,根据配置周期执行命令。并且它能够获取每个任务的输出(如果有输出的话),并将结果通过电子邮件发送给定时任务的所有者。更为详细的内容大家可以通过man cron指令查阅系统文档。- 查看cron是否启动sudo launchctl list | grep cronMACOSX是基于UNIX核心的系统,cron是系统自启动的守护进程。所以一般终端输入如上命令并填写密码后,会展示如下。


第一列数字,表示进程的pid,如果是正在运行的进程,显示数字,如果没在运行,显示“-”;第二列数字表示进程的退出代码,如果已经完成并退出,显示“0”,如果是负数,表示结束进程的信号量;第三列则表示是该进程的名称标识。

  • 添加定时任务。crontab –e 编辑某个用户的crontab文件内容。如果不指定用户,则表示编辑当前用户的crontab文件。【注意,cron的一系列操作是区分用户的哦】crontab –l 显示某个用户的crontab文件内容。同样不指定用户时,显示当前用户的crontab文件。crontab –r 删除某个用户的crontab文件。我们通过crontab –e编辑保存自己的定时任务,譬如下图,为我之前的一个定时任务。

编辑完毕保存退出后展示crontab:installing new crontab即表示定时任务添加成功。

cron添加定时任务的格式为:



/ 常用来与范围组合指定相隔时间,例如

*/10 * * * * command 即表示每隔10分钟执行一次指令。


简单而言,定时任务的配置就到此结束了。接下来给大家分享下在配置过程中遇到的一些小坑。

1)脚本执行要成功,环境变量先保证。

定时任务执行完毕,都会将任务输出信息通过电子邮件的形式发送给当前用户,默认路径:/var/mail/[user_name]。刚开始我收到的邮件如下:



奇怪……明明本地运行python脚本没问题,adb的环境也都搭建成功可用,偏偏设置了定时任务后执行报错。经查,cron会在用户登录时的home目录中提取用户的默认环境变量加上默认的shell(/usr/bin/sh),如果用户默认没shell,则不加。因此cron所知道的环境变量相当有限,所以在使用时首先要保证文件中提供必要的路径(多用绝对路径)和环境变量。如下图,提示我找不到adb和python3时,导入环境变量,并添加python3的绝对路径后,问题迎刃而解了。



2)linux系统平台下,cron服务可以正常重启,开/闭。但是在修改crontab文件后试图通过 sudo /usr/sbin/cron restart重启服务,却一直提示cron already running。

其实原因我们之前已经提到过,cron是系统自启动的守护进程。即便关掉后还是会自启动运行。

3)还有一点要注意的是,每个定时任务执行完毕后,系统都会给当前用户发送邮件。如果是一个长期配置的定时任务,日积月累,可能会生成一个特别大的日志文件。

因此,我们可以先将需要的信息重定向输出到指定路径的文件中,然后在每个定时任务后面进行重定向处理:>/dev/null 2>&1,如此一来,标准输出和错误输出都会输出到“黑洞”。“黑洞”学说法,如果有不了解的同学,一查便知哦。

以上,便是近期在Mac环境下配置定时任务的初接触,简单梳理。有问题的地方,还请大家多多指教。

Q


本文转载自 360质量效能