1、前言
最近需要一个自动化请求一个地址获取信息,我为此制作一个nodejs脚本,命令行里输入:
node myvote.js -n 1000
这里的 1000 就是运行的次数,但是不能输入很大的值,否则服务器一直返回error;一个折衷的方法就是每隔半分钟启动一下这个脚本,这就需要在OSX中定时运行程序;
到网上找了一下教程,文章 OSX系统添加定时任务 讲解得不错,使用 crontab 和 launchctl 都可以启动定时任务,推荐使用后者;
2、行动
2.1、编写脚本
要想自动化,必须要有shell脚本,其实也很简单,将下列名字保存成 auto.sh :
#!/bin/sh
/usr/local/bin/node /Users/jscon/Desktop/coding/demos/vote/bin/myvote.js -n 1000
注意要用绝对路径
然后脚本要改成可执行状态:
sudo chmod 777 auto.sh
2.2、方案一:launchctl + plist文件
Step 1: 首先编写 plist 文件
将下列代码保存成 com.cc.jscon.auto.plist
:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.cc.jscon.auto</string>
<key>ProgramArguments</key>
<array>
<string>/Users/jscon/Desktop/coding/demos/vote/bin/auto.sh</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>StartInterval</key>
<integer>25</integer>
<key>StandardOutPath</key>
<string>/Users/jscon/Desktop/coding/demos/vote/bin/auto.log</string>
<key>StandardErrorPath</key>
<string>/Users/jscon/Desktop/coding/demos/vote/bin/auto.err</string>
</dict>
</plist>
- label这里就是给这个任务名个名字,这里一般取plist的文件名,这个名字不能和其它的plist重复。
- auto.sh就是我们要执行的脚本
- StartInterval里边的参数是说 每25秒 时候执行一下脚本。
- StandardErrorPath指定了错误文件,这个文件需要自己创建,保证文件的存在;
- StandardOutPath指定了正常输出的log,同样需要保证文件存在;
Step 2: 执行 launchctl
将plist文件移动到 ~/Library/LaunchAgents
文件夹下,然后 在~/Library/LaunchAgents 路径下执行下列命令:
LaunchAgents :launchctl load ~/Library/LaunchAgents/com.cc.jscon.auto.plist
LaunchAgents :launchctl start ~/Library/LaunchAgents/com.cc.jscon.auto.plist
好了这样就能自动化运行了。
还可以使用的命令有:
launchctl stop ~/Library/LaunchAgents/com.cc.jscon.auto.plist
launchctl unload ~/Library/LaunchAgents/com.cc.jscon.auto.plist
launchctl list
- 要让任务生效,必须先load命令加载这个plist
- 如果任务呗修改了,那么必须先unload,然后重新load
- start可以测试任务,这个是立即执行,不管时间到了没有
- 执行start和unload前,任务必须先load过,否则报错
- stop可以停止任务
也可以借助在线工具launched 生成所需要的文件,这比copy代码要有保障地多,注意在线生成的话,不能指定脚本路径,所以使用 sh -c 命令,点击“生成”按钮之后可以获得plist
文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.zerowidth.launched.jscon.auto</string>
<key>ProgramArguments</key>
<array>
<string>sh</string>
<string>-c</string>
<string>node /Users/jscon/Desktop/coding/demos/vote/bin/myvote.js -n 1000</string>
</array>
<key>StartInterval</key>
<integer>20</integer>
</dict>
</plist>
这个网站还提供了现成的命令将这个文件拷贝到指定目录下,比如:
mkdir -p ~/Library/LaunchAgents
curl -o ~/Library/LaunchAgents/com.zerowidth.launched.jscon.auto.plist http://launched.zerowidth.com/plists/98ad2db0-7190-0133-5000-61a1e51a99c5.xml
launchctl load -w ~/Library/LaunchAgents/com.zerowidth.launched.jscon.auto.plist
非常方便地将你想要做的事情一步到位了;
注意这里的plist名字是
com.zerowidth.launched.jscon.auto.plist
,毕竟是在人家的网站上生成的,所以命名就是用它的了;不用担心,反正最后能正常运行;
2.3、方案二:使用GUI软件
如果觉得上面操作起来比较麻烦,可以使用 macscheduler软件,使用界面配置定时任务;点击 Browse... 按钮加载脚本:
没错,还是离不开脚本,这次需要使用 AppleScript
,不过使用起来比较简单。这里我们将下面的代码保存成脚本即可:
do shell script "/Users/jscon/Desktop/coding/demos/vote/bin/auto.sh"
这 AppleScript
脚本还是很容易入门的,推荐Applescript快速教程。
3、总结
这是我第一次使用脚本写定时任务,就总结成此文,方便后续查阅;
MacOS的定时任务虽然麻烦,但也可以工程流程化,尤其可借助在线工具launched 生成所需要的文件,所以最核心的还是自己的nodejs程序;
参考文章: