windows & MacOS 的定时JOB设置

做了一些程序以后呢,爬取网站呀,获取监控呀,就需要设定定时作业。
定时作业部署在不关机的server上肯定谁最好的。但是正常人肯定不是随便就能搞到服务器的,服务器还是有成本的。

那么就用自己的pc机器吧~
(更新:发现可以通过云平台的serverless服务执行定时脚本。腾讯云TencentCloud的Serverless云函数SCF

Windows OS

Windows,最普遍的操作系统。
本身自带一个程序【计划任务(Task Scheduler)】
我们使用它设定和执行定时任务。

Task Scheduler(计划任务)

搜索task scheduler就能找到,然后新建定时任务。

定时任务(方法一)

直接新建,然后设置【Trigger】,【Actions】选择要执行的程序。
注意,如果程序脚本中涉及到了读写文件的操作,文件地址一定要写全绝对路径。因为执行脚本的目录并不是程序所在的相对路径的。
(因为我的直接脚本都是python写的,所以我执行程序使用的python)

定时任务(方法二)

除了直接执行程序,也可以选择写一个powershell脚本,执行脚本。然后在powershell脚本中调用程序脚本。
是有种“脱裤子放屁”的感觉哈。
除了能避免忽略文件绝对路径的问题,好像也没啥用途。 (也不是什么主要优点)
可能我本人,比较喜欢powershell脚本吧。 o( ̄︶ ̄)o
Windows上如果是一般的脚本,建议还是通过powershell写。

MacOS

Mac使用自带的launchctl服务。

编写plist文件

首先要编写plist文件,代码参考如下。
Plist文件,是launchctl服务执行使用的。对于其他脚本的执行,需将脚本名称写在plist文件里。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?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>
<!-- Label唯一的标识 -->
<key>Label</key>
<string>lhd.backstage.program.plist</string>
<!-- 指定要运行的脚本 -->
<key>ProgramArguments</key>
<array>
<string>/Users/konta/Sky_App/backstage_program/back_run.sh</string>
</array>
<!-- 指定要运行的时间 -->
<key>StartCalendarInterval</key>
<dict>
<key>Minute</key>
<integer>07</integer>
<key>Hour</key>
<integer>17</integer>
</dict>
<!-- 标准输出文件 -->
<key>StandardOutPath</key>
<string>/Users/konta/Sky_App/backstage_program/backstage_program.log</string>
<!-- 标准错误输出文件,错误日志 -->
<key>StandardErrorPath</key>
<string>/Users/konta/Sky_App/backstage_program/backstage_program.err</string>
</dict>
</plist>

编写sh脚本

plist文件中指定了脚本地址,我们需要创建这个sh脚本。
以如下代码为例,我直接是使用python执行py脚本。

1
2
3
4
5
#!/bin/sh
# 进入py程序所在目录
cd /Users/konta/Sky_App/backstage_program &&
# 执行python脚本(注意前面要指定python运行环境/usr/bin/python,根据自己的情况改变。我python3使用的是anaconda环境,所以不一样)
/Users/konta/anaconda3/bin/python web_info.py

plist文件部署位置

plist可以放在如下位置:

  • ~/Library/LaunchAgents 由用户自己定义的任务项
  • /Library/LaunchAgents 由管理员为用户定义的任务项
  • /Library/LaunchDaemons 由管理员定义的守护进程任务项
  • /System/Library/LaunchAgents 由Mac OS X为用户定义的任务项
  • /System/Library/LaunchDaemons 由Mac OS X定义的守护进程任务项
    我自己是放在了 【~/Library/LaunchAgents 】里面。
    【 /Library/LaunchAgents】目录,由于Mac本身的安全策略,无法直接把文件放进去,需要先解除安全策略,我嫌麻烦就没用。

    lauchctl命令加载

    只有加载了文件的任务,才能定时执行。terminal中输入:
    1
    2
    # 加载任务, -w会将plist文件中无效的key覆盖掉,建议加上。
    launchctl load -w lhd.backstage.program.plist

以上,定时job就设置完成了。

常规launchctl命令

1
2
3
4
5
6
7
8
9
10
launchctl load -w lhd.backstage.program.plist

# 删除任务。如果plist文件有调整,需要先删除任务,再重新加载。
launchctl unload -w lhd.backstage.program.plist

# 立即执行任务。忽略设定的时间,立即执行。可以用来检查执行情况。
launchctl start lhd.backstage.program.plist

# 查看任务列表, 使用grep过滤
launchctl list | grep 'lhd'

总结

个人觉得,都挺方便的。

只不过windows一如既往的可以通过可视化的配置界面进行设定,mac要一直通过在terminal码命令行设置。

windows:task_scheduler ➡️ powershell脚本 ➡️ py程序
macOS:launchctl ➡️ sh脚本 ➡️ py程序
思路都是一样的,就是:使用当前操作系统下,原生支持度最高的语言,编写脚本,调用实际执行程序或脚本。

以上。