IOS/MAC OS定时任务配置 Schedule jobs using launchd

在linux下执行定时任务可以使用crontab,目前mac os也可以使用它,不过已不推荐使用。

推荐做法是采用plist脚本,plist脚本可以设置执行的动作,时间间隔等其他一些信息。

另外crontab的最小时间间隔是一分钟,使用plist脚本原则上时间间隔可以为一秒。

plist脚本存放路径为/Library/LaunchDaemons或/Library/LaunchAgents,其区别是后一个路径的脚本当用户登陆系统后才会被执行,前一个只要系统启动了,哪怕用户不登陆系统也会被执行。

IOS iphone4上plist文件路径为/System/Library/LaunchDaemons。

可以通过两种方式来设置脚本的执行时间。一个是使用StartInterval,它指定脚本每间隔多长时间(单位:秒)执行一次;另外一个使用StartCalendarInterval,它可以指定脚本在多少分钟、小时、天、星期几、月时间上执行,类似如crontab的中的设置。

一个简单例子如下,文件名info.chenpeng.cron.plist,保存到/System/Library/LaunchDaemons下:

<?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>info.chenpeng.cron.plist</string>
<key>ProgramArguments</key>
<array>
<string>/chenpeng/cron.sh</string>
</array>
<key>StartCalendarInterval</key>
<dict>
<key>Minute</key>
<integer>0</integer>
</dict>
<key>KeepAlive</key>
<false/>
<key>LaunchOnlyOnce</key>
<false/>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>

其中key是plist脚本定义的属性,紧跟着的下一行是该属性对应的值。上述脚本是每间隔60秒执行一次/chenpeng/cron.sh这个shell脚本,也可以使用StartCalendarInterval来替换StartInterval达到同样的效果,例如:

<key>StartCalendarInterval</key>
<dict>
  <key>Minute</key>
  <integer>0</integer>
</dict>

上述设置的意思为每天的每个小时的第0分钟执行,也即使每60秒执行一次。

plist脚本中定义的属性以及具体的含义,可以参看苹果官方网站的说明,地址为:launchd.plist(5) Mac OS X Manual Page

launchctl命令可以控制plist脚本停止或重新加载。例如:

停止脚本info.chenpeng.cron.plist运行
launchctl unload /System/Library/LaunchDaemons/info.chenpeng.cron.plist

启动脚本info.chenpeng.cron.plist运行
launchctl load /System/Library/LaunchDaemons/info.chenpeng.cron.plist

如果执行上面命令看到Not plist file (skipping)这样的错误,其原因可能是该脚本的没有可执行权限。使用

chmod a+x info.chenpeng.cron.plist

修改一下即可。

launchctl list

可以查看当前系统的“cron” list。

launchctl用法:

launchctl load ~/Library/LaunchAgents/org.nathanamy.archive-tweets.plist

launchctl unload ~/Library/LaunchAgents/org.nathanamy.archive-tweets.plist

launchctl start org.nathanamy.archive-tweets

launchctl stop org.nathanamy.archive-tweets launchctl list

 

以下为http://www.ipadforums.net/ipad-hacking/38989-cron-jb-ipad.html的一个例子:

The StartInterval parameter gives the delay time – alternatively the cron-like timing can be defined in StartCalendarInterval.

I made a file named: com.DkSill.SendHostStart.plist and linked it into /System/Library/LaunchDaemons/

the file /usr/bin/sendhost.sh contains my bash script with whatever i like to do.

here the plist file:

===========================
<?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.DkSill.SendHostStart</string>
<key>ProgramArguments</key>
<array>
<string>/usr/bin/sendhost.sh</string>
<string>parameter1</string>
<string>parameter2</string>
</array>
<key>Nice</key>
<integer>20</integer>
<key>StartInterval</key>
<integer>1777</integer>
</dict>
</plist>
================================

and here a script file deposing my actual TCP/IP address onto my web server:

================================
#!/bin/bash
date >> /var/mobile/sendhost.log
ssh -i /var/mobile/.ssh/id_rsa username@myserver.com ‘echo `date +20%y.%m.%d.%H.%M` `echo $SSH_CLIENT | cut -f 1 -d \ ` >> ~/www/tcp-log/ipad.txt’
================================

Like this, I can track where the device is connected. if it gets stolen, then at least i will get this info.

in a next step, it would be cute to work out the gps coordinates of where the device is…

参考http://nathangrigg.net/2012/07/schedule-jobs-using-launchd/

About 智足者富

http://chenpeng.info

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>