MAC本如何优雅的创建定时任务
在MACOS上设置定时任务大体有两种方案。一种是使用crontab,一种是使用Schedule,今天结合我的使用简单介绍一下。
先说一下背景,为什么MAC可以用crontab。如果使用过Linux的同学,设置定时任务经常会使用crontab、nohup。苹果根据FreeBSD开发了Mac OS,后续的每一个新版本的Mac OS系统都很大程度上保留了FreeBSD的新特性。当然也包括Shell,也包括crontab。
适用的场景,举个例子,公司每天下午4点钟准时订餐,错过可能就要饿肚子了,为了在繁忙的工作中,还能够记起这个事情,决定设置个定时任务提醒自己。
我第一选择了写个简单的applescript。
on callmeican ( ) tell application "Google Chrome" open location meican_url activate end tell end callmeican say "不要这么拼了,预订美餐时间到了" display dialog "不要这么拼了,预订美餐时间到了(截至时间16:30)!" buttons { "好的" , "我不定了" } default button 1 if the button returned of the result is "好的" then -- action for 1st button goes here callmeican ( ) end if |
脚本的作用大概是MAC会通过弹窗和语音提醒我该订餐了,如果选择定,就自动用浏览器打开订餐的页面。这个脚本每天在四点执行。
1、使用crontab设置定时任务
crontab -e 或者sudo crontab -e。
00 16 * * * osascript /Users/hanlingzhi/project/applescript/meican.scpt
输入完成后,保存退出。系统自动建立新cron,提示如下:crontab: installing new crontab。设置非常简单。
2、使用苹果的Schedule jobs using launchd设置定时任务。需要写一个plist文件,描述任务的动作、间隔的时间、日志输出等参数。
我创建一个plist文件com.hanlingzhi.cron.meican.plist,大概内容如下:
<? xml version = "1.0" encoding = "UTF-8" ?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> < plist version = "1.0" > < dict > <!-- 名称,要全局唯一 --> < key >Label</ key > < string >com.hanlingzhi.cron.meican</ string > <!-- 命令, 第一个为命令,其它为参数--> < key >ProgramArguments</ key > < array > < string >osascript</ string > < string >/Users/hanlingzhi/project/applescript/meican.scpt</ string > </ array > <!-- 运行时间 --> < key >StartCalendarInterval</ key > < dict > < key >Minute</ key > < integer >0</ integer > < key >Hour</ key > < integer >16</ integer > </ dict > <!-- 标准输入文件 --> < key >StandardInPath</ key > < string >/Users/hanlingzhi/project/applescript/log/run-in-meican.log</ string > <!-- 标准输出文件 --> < key >StandardOutPath</ key > < string >/Users/hanlingzhi/project/applescript/log/run-out-meican.log</ string > <!-- 标准错误输出文件 --> < key >StandardErrorPath</ key > < string >/Users/hanlingzhi/project/applescript/log/run-err-meican.log</ string > </ dict > </ plist > |
然后将plist文件放在/Users/hanlingzhi/Library/LaunchAgents,你的用户目录下,然后执行launchctl load plist就可以启动了。
plist脚本存放路径为/Library/LaunchDaemons或用户目录/Library/LaunchAgents,其区别是后一个路径的脚本当用户登陆系统后才会被执行,前一个只要系统启动了,哪怕用户不登陆系统也会被执行。
系统定义了几个位置来存放任务列表
- ~/Library/LaunchAgents 由用户自己定义的任务项
- /Library/LaunchAgents 由管理员为用户定义的任务项
- /Library/LaunchDaemons 由管理员定义的守护进程任务项
- /System/Library/LaunchAgents 由Mac OS X为用户定义的任务项
/System/Library/LaunchDaemons 由Mac OS X定义的守护进程任务项
可以通过两种方式来设置脚本的执行时间。一个是使用StartInterval,它指定脚本每间隔多长时间(单位:秒)执行一次;另外一个使用StartCalendarInterval,它可以指定脚本在多少分钟、小时、天、星期几、月时间上执行,类似如crontab的中的设置。
< key >StartInterval</ key > < integer >3600</ integer > 或者 < key >StartCalendarInterval</ key > < dict > < key >Minute</ key > < integer >30</ integer > < key >Hour</ key > < integer >9</ integer > </ dict > |
launchctl的命令使用大家看一下帮助文档。
由于操作还是比较复杂,为了帮助快速执行,写了个shell快速拷贝新的plist并完成服务重启
__path= '/Users/hanlingzhi/project/applescript' __plist_path=${__path} /plist __launchagents_path= '/Users/hanlingzhi/Library/LaunchAgents' # 拷贝plist到用户自己定义的任务项目录 cp -rf ${__plist_path}/* ${__launchagents_path} # 根据plist中的文件遍历load for plist_file in ` ls ${__plist_path}` do echo "重启${plist_file}定时任务" launchctl unload ${__launchagents_path}/${plist_file} sleep 0.5 launchctl load ${__launchagents_path}/${plist_file} task_name=` echo ${plist_file} | sed 's/.plist//g' ` launchctl list | grep ${task_name} done |
总结一下
虽然plist的设置会复杂很多。但是当前在mac os还是倾向于推荐使用Plist的方法,crontab已不推荐使用。
两者的区别:
1、plist可以设置到秒,而crontab只能到分钟。
2、plist可以同时应用于Mac OS/Iphone。
3、plist对于MAC上系统交互的操作更支持(我就出现过用crontab设置,运行时出现execution error: 不允许用户交互。 (-1713)的错误)
MAC本如何优雅的创建定时任务的更多相关文章
- 四、springBoot 优雅的创建定时任务
前言 好几天没写了,工作有点忙,最近工作刚好做一个定时任务统计的,所以就将springboot 如何创建定时任务整理了一下. 总的来说,springboot创建定时任务是非常简单的,不用像spring ...
- 使用Quartz创建定时任务
项目开发中经常需要定时循环执行某些任务 比如定时发送报表,定时发送邮件,亦或者定时清理缓存,定时更新数据等等 有些时候可以简单地利用Windows Server的计划任务执行程序 Linux也有相应的 ...
- Yii通过控制台命令创建定时任务
假设Yii项目路径为 /home/apps/ 1. 创建文件 /home/apps/protected/commands/crons.php <?php $yii = '/home/apps/f ...
- JAVAEE——BOS物流项目13:Quartz概述、创建定时任务、使用JavaMail发送邮件、HighCharts概述、实现区域分区分布图
1 学习计划 1.Quartz概述 n Quartz介绍和下载 n 入门案例 n Quartz执行流程 n cron表达式 2.在BOS项目中使用Quartz创建定时任务 3.在BOS项目中使用Jav ...
- windows创建定时任务执行python脚本
一.创建定时任务 \ [程序或脚本]文本框中填的是Python编译器的名称,一般就是python.exe, [起始于]文本框中填的是Python编译器的目录,上图中假设你的Python编译器的完整路径 ...
- Springboot定时任务原理及如何动态创建定时任务
一.前言 上周工作遇到了一个需求,同步多个省份销号数据,解绑微信粉丝.分省定时将销号数据放到SFTP服务器上,我需要开发定时任务去解析文件.因为是多省份,服务器.文件名规则.数据规则都不一定,所以要做 ...
- linux创建定时任务,定时执行sql
终于弄清楚一个问题了.linux创建定时任务,定时执行sql,其中分为两个case. case-1 sql语句较少,因此直接在 shell脚本中 写sql语句.如下: [oracle@Oracle11 ...
- Spring Boot中使用@Scheduled创建定时任务
我们在编写Spring Boot应用中经常会遇到这样的场景,比如:我需要定时地发送一些短信.邮件之类的操作,也可能会定时地检查和监控一些标志.参数等. 创建定时任务 在Spring Boot中编写定时 ...
- Spring boot创建定时任务
基于spring boot的应用创建定时任务不要太简单,给一个类加上@Configuration @EnableScheduling注解,然后给该类需要定时执行的方法加上@Scheduled(cron ...
随机推荐
- DELPHI中多线程知识【转】
本文的内容取自网络,并重新加以整理,在此留存仅仅是方便自己学习和查阅.所有代码均亲自测试 delphi7下测试有效.图片均为自己制作. 多线程应该是编程工作者的基础技能, 但这个基础我从来没学过,所以 ...
- C++ STL算法系列1---unique , unique_copy函数
一.unique函数 类属性算法unique的作用是从输入序列中“删除”所有相邻的重复元素. 该算法删除相邻的重复元素,然后重新排列输入范围内的元素,并且返回一个迭代器(容器的长度没变,只是元素顺序 ...
- Firebug控制台详解,让调试js代码变得更简单
http://www.open-open.com/lib/view/open1373120100347.html Firebug是网页开发的利器,能够极大地提升工作效率. Firebug控制台详解 控 ...
- Intent的属性及Intent-filter配置——Component属性
Intent的Component属性需要接受一个ComponentName对象,ComponentName对象包含如下几个构造器. ComponentName(String pkg,String cl ...
- Everything开机自启
第一步:关闭自动启动 在设置中关闭everything开机自动启动. 第二步:创建计划任务 点击“开始”—“任务计划程序”—“创建任务” 首先设置任务的名称等,注意一定要勾选“使用最高权限运行”. 然 ...
- HTML 脚本
JavaScript 使 HTML 页面具有更强的动态和交互性. 在线实例 插入一段脚本如何将脚本插入 HTML 文档. 使用 <noscript> 标签如何应对不支持脚本或禁用脚本的浏览 ...
- HDU5882
Balanced Game Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...
- 如何:使用 Visual Basic 编写基于 Unity3D 的计算器
随着 .NET 全平台战略的推进,微软正在让以 C# 为先锋的 .NET 拥有跨平台特性.这个过程中一直有人想知道其它 .NET 语言对跨平台的支持有什么改进,熟悉 C# 但是喜欢用 VB 的我也不例 ...
- [html5] 学习笔记-应用缓存与Web workers
1.应用缓存 HTML5引入了应用缓存程序,这意味着Web应用可进行缓存,并可在没有因特网连接时访问. 应用缓存的优势: 1)离线浏览--用户可在应用离线时使用它们 2)速度--已缓存是从本地加载,加 ...
- JQuery之 serialize() 及serializeArray() 实例介绍
这两个方法都是jq封装的,主要用于form表单. serialize(); 1.创建一个标准url编码显示的文本字符转: 2.操作的对象是表单元素结合的jq对象: serializeArray(); ...