专栏首页码海如何使用LaunchRocket自动定时执行任务

如何使用LaunchRocket自动定时执行任务

我们经常有这样的需求,发现磁盘空间快满了要去手动清一下,clone完自己star的项目后,隔一段时间会去手动pull一下代码,这样的操作虽然可行,但无形之中浪费了我们很多时间,有没一种方式能自动定时地帮你去清空间,自动帮你去pull一下你喜欢的项目的代码呢,今天就给大家介绍一下mac自动定时执行任务的神器,launchRocket

不过在介绍此神器之前我们还要先了解一些概念性的东西

在linux/unix下,我们通常用crontab来定时执行我们的任务,什么是crontab

crontab 是一个可以用来根据时间、日期、月份、星期的组合来调度对重复任务的执行的守护进程。

不过在Mac上,自从10.4(也就是Tiger)起,crontab已经被deprecated了,因为Apple推出了一款更强大的工具launchd

a unified, open-source service management framework for starting, stopping and managing daemons, applications, processes, and scripts. Written and designed by Dave Zarzycki at Apple, it was introduced with Mac OS X Tiger and is licensed under the Apache License.

它吸收了crontab的优点,且更加灵活,更加强大,它除了可以定时执行某些任务,也可以基于某些事件来触发任务,比如当监听到网络连接,或者当观察某个文件被移到某个文件夹,都可以触发我们指定的任务,甚至当执行的任务crash掉了,launchtl能做到让它重新运行!最大的区别是在系统即将sleep或shutdown的情况下,如果此时schedule的任务刚好要执行,两者对它的处理方式的不同,crontab只是简单的不运行此调度任务,但launchd会注意到此任务被终止了,将会在适当的时机再次重启此任务!

launchd有两种形式: launchDaemons和launchAgents,这两种形式有何区别呢?主要区别在于agent代表的是当前已登录的用户执行的任务,而daemon代表的是root用户或者任何你用UserName这个key(这个key在下文所说的plist文件里指定)指定的用户的任务

任务及其表示形式

好了,现在我们已经知道了launchd的功能了,那么我们该如何为其指定一个任务来让其定时执行呢?实际上launchd的每一个任务(job)都对应了一个plist文件(以xml的格式), 它被launchd视为daemon还是agent就看我们把它放在以下哪个目录下了

类型

位置

代表谁执行

用户代理(User Agents)

~/Library/LaunchAgents

当前登录的用户

全局代理(Global Agents)

/Library/LaunchAgents

当前登录的用户

全局守护进程(Global Daemons)

/Library/LaunchDaemons

root或者在plist里指定UserName此key对应的用户

系统代理(System Agents)

/System/Library/LaunchAgents

当前登录的用户

系统守护进程(System Daemons)

/System/Library/LaunchDaemons

root或者在plist里指定UserName此key对应的用户

从上图可知,我们可以将plist文件放在LaunchAgents或LaunchDaemons目录下,都可以定时执行plist里指定的任务,需要注意的是,我们不应该把第三方的任务放在/System/Library上,这个目录下存放着对于操作系统所需要的极其重要的任务!应该把第三方任务放在/Library的LaunchAgents或LaunchDaemons目录下!

plist文件格式

好了,前面既然说了job是用一个plist文件来指定的,那我们来看下这个plist文件的格式是咋样的,来看一个demo

<?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.example.hello</string>
   <key>ProgramArguments</key>
   <array>
       <string>/Users/ronaldo/test.sh</string>
   </array>
   <key>Nice</key>
   <integer>1</integer>
   <key>StartInterval</key>
   <integer>60</integer>
   <key>RunAtLoad</key>
   <true/>
   <key>StandardErrorPath</key>
   <string>/tmp/AlTest1.err</string>
   <key>StandardOutPath</key>
   <string>/tmp/AlTest1.out</string>
</dict>
</plist>

我们来一步步解释这些key

  • Label 这个key对于每一个job都是必须且惟一的,是每一个job的惟一标识符
  • ProgramArguments 指定了我们要执行的脚本的路径
  • Nice 指定了此任务执行的优先级,从-20到20,数组越低,代表执行的优先级越高
  • StartInterval 指定了每隔多长时间执行一次ProgramArguments指定的脚本(默认单位是秒)
  • RunAtLoad 指定了当脚本被加载时,ProgramArguments指定的脚本就立即执行,对daemon而言,它意味着机器一启动就马上执行,而对agent而言意味着用户一登录就马上执行
  • StandardErrorPath 指定了标准输出错误的路径,比如如果ProgramArguments指定的脚本执行失败了,就会将错误信息写到此错误日志文件里
  • StandardOutPath 指定了标准输出文件的路径,脚本里的任何echo等输出信息可以在此文件里看到

当然以上选项只是选择了几个选项进行说明而已,实际上还有更多的选项可以设定,比如我们还可以指定脚本在每一天的某一时刻执行等等,请自行查阅相关文档

好了,现在我们已经知道如何定义一个job了,然后你可以把这些写好的job的plist文件丢到launchAgent或laucnDaemon目录里了,当然了,还有一种选择,想必聪明的你已经想到了,那就是我们今天要介绍的主角LaunchRocket!

LaunchRocket

将写好的plist丢到相应的Agent或Daemon目录里来执行固定可以,但不够直观,LaunchRocket就为我们提供了一个直观的图形界面,如下

我们可以清楚的看到,哪一个任务在跑,是否以Root身份执行,是否一登录就执行,我们可以根据脚本的运行情况来决定是否将这两个选项勾选上,一切尽在掌握!

我们写好plist文件之后只需要点击Add .plist就可将任务添加进来,是不是很方便!

接下来我们就做一个任务,定时更新hosts文件。

首先请根据LaunchRocket官网的提示自行安装它

由于GFW的原因,要访问google,我们可以采取两种方式,一种是用V**,另一种绑定Google的hosts,github上已经有项目为我们提供了此hosts,可以点击 这里 查看,这个hosts项目会定时更新,隔几天会更新一次,如果我们手动clone再copy到/etc/hosts明显浪费时间,这个时候我们就可以用LaunchRocket了

我们先来写将此项目的hosts copy到/et/hosts的脚本,非常简单,如下

//hosts_update.sh#!/bin/sh
cd /Users/ronaldo/Documents/husor/hosts;
git pull;
sudo cp hosts /etc/hosts;

注意:由于我已经将hosts clone到本地了,所以这里我用的方法进入到hosts目录下然后git pull的方式更新 我们将此脚本命名为hosts_update.sh,接下来该写我们的plist文件,我们指定每隔一小时更新一下/etc/hosts文件,对应的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.ronaldo.host</string>
   <key>ProgramArguments</key>
   <array>
       <string>/Users/ronaldo/hosts_update.sh</string>
   </array>
   <key>Nice</key>
   <integer>1</integer>
   <key>StartInterval</key>
   <integer>60</integer>
   <key>RunAtLoad</key>
   <true/>
   <key>StandardErrorPath</key>
   <string>/tmp/AlTest1.err</string>
   <key>StandardOutPath</key>
   <string>/tmp/AlTest1.out</string>
</dict>
</plist>

接下来我们只要手指一点,将此plist添加到LaunchRocket即可,需要注意的是,将文件copy到/etc/hosts需要管理员权限,所以我们勾上As Root这个选项即可,同时我们也需要在登录的时候也执行一下此脚本,所以也勾上At Login,这样此脚本每隔一小时就能自动执行了

妈妈再也不用担心我的访问外国网站了!

本文分享自微信公众号 - 码海(seaofcode),作者:谢堃

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-07-28

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 使用 SecureRandom 产生随机数采坑记录

    我们的项目工程里经常在每个函数需要用到 Random 的地方定义一下 Random 变量(如下)

    kunge
  • 微服务追踪系统

    上文我们学习了一下分布式调用链追踪系统的原理和实践,有些读者对其中的实现原理提出了一些疑问,所以有了这篇专门写给小白看的微服务追踪系统,相信大家看完对其原理会有...

    kunge
  • 你说你会位运算,那你用位运算来解下八皇后问题吧

    位运算在生产或算法解题中并不常见,不过如果你用得好,可以达到事半功倍的效果,而且位运算用得好,也可以极大地提升性能,如果在生产或面试中能看到使用位运算来解题,会...

    kunge
  • LRU算法原理解析

    LRU是Least Recently Used的缩写,即最近最少使用,常用于页面置换算法,是为虚拟页式存储管理服务的。

    py3study
  • iOS系统在线下载安装ipa文件,以及跳转描述文件信任证书的实现

    1、利用 itms-services 和 plist 文件,在线下载安装 ipa 文件。

    德顺
  • macos 关联本地文件

    小贝壳
  • Key-Value Memory Network

    Deep Memory Network 深度记忆网络 Deep Memory Network在Aspect Based Sentiment方向上的应用(opt...

    Steve Wang
  • ASP.NET Core 数据加解密的一些坑

    ASP.NET Core 给我们提供了自带的Data Protection机制,用于敏感数据加解密,带来方便的同时也有一些限制可能引发问题,这几天我就被狠狠爆了...

    Edi Wang
  • ADB server didn't ACK

    [2015-05-29 11:55:03 - adb] ADB server didn't ACK [2015-05-29 11:55:03 - adb] * ...

    用户1155943
  • Azure虚拟机部署Skype for Business Server 三、部署Skype前端服务器

    上一篇已经准备好AD,DNS,参照创建AD虚拟机的方法再创建Skype后端数据库服务器、前端服务器。

    杨强生

扫码关注云+社区

领取腾讯云代金券