OSX定时执行脚本

简介: 1、前言 最近需要一个自动化请求一个地址获取信息,我为此制作一个nodejs脚本,命令行里输入: node myvote.js -n 1000 这里的 1000 就是运行的次数,但是不能输入很大的值,否则服务器一直返回error;一个折衷的方法就是每隔半分钟启动一下这个脚本,这就需要在

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程序;

参考文章:

目录
相关文章
|
数据可视化 UED
移动应用的UI/UX设计原则与实践
【7月更文挑战第2天】移动应用UI/UX设计聚焦简约、一致性与用户中心原则。关键在于理解用户需求,创建清晰的视觉层次,实现响应式布局。UX关注反馈速度、情感连接及无障碍访问。通过用户调研、原型测试和持续迭代,提升满意度和产品竞争力。
|
编解码 人工智能 自然语言处理
让大模型理解手机屏幕,苹果多模态Ferret-UI用自然语言操控手机
【5月更文挑战第29天】苹果推出Ferret-UI,一个结合图像识别和自然语言处理的多模态大语言模型,允许用户通过自然语言指令操控手机。该系统能适应不同屏幕布局,识别UI元素并执行相应操作,有望变革手机交互方式,提升无障碍体验,并在测试和开发中发挥作用。但需面对屏幕多样性及准确性挑战。[论文链接](https://arxiv.org/pdf/2404.05719.pdf)
512 3
|
IDE Java 开发工具
python缩进错误(IndentationError)
【7月更文挑战第12天】
2595 10
|
Python
vscode 使用python无法导入库
vscode 使用python无法导入库
607 0
|
Web App开发 数据采集 前端开发
如何利用Selenium实现数据抓取
如何利用Selenium实现数据抓取
|
存储 机器学习/深度学习 Rust
Python性能优化指南--让你的Python代码快x3倍的秘诀
Python最为人诟病的就是其执行速度。如何让Python程序跑得更快一直是Python核心团队和社区努力的方向。本文将带大家深入探讨Python程序性能优化方法。
5831 1
Python性能优化指南--让你的Python代码快x3倍的秘诀
|
Android开发 iOS开发 流计算
Mac 安卓(Android) 安装 Genymotion 模拟器
Mac 安卓(Android) 安装 Genymotion 模拟器
1533 0
|
Web App开发 JSON 数据库
如何使用Python的Selenium库进行网页抓取和JSON解析
如何使用Python的Selenium库进行网页抓取和JSON解析
|
存储 机器学习/深度学习 人工智能
LangChain + Streamlit + Llama:将对话式AI引入本地机器
在过去的几个月里,大型语言模型(LLM)获得了极大的关注,引起了全球开发人员的兴趣。这些模型创造了令人兴奋的前景,特别是对于从事聊天机器人、个人助理和内容创作的开发人员而言。LLM带来的可能性引发了开发人员的热情 |人工智能 |NLP社区。
843 0