mac下定时执行python程序(附不执行解决方案).md

需要用到:定时任务crontabvi编辑器以及finder获取文件的路径

finder显示完整路径,后面用到

mac下定时执行python程序(附不执行解决方案).md_第1张图片
image.png

如图的设置,在命令行输入下面的代码:

defaults write com.apple.finder _FXShowPosixPathInTitle -bool TRUE;

重启后就有效果,对应还原如下:

defaults delete com.apple.finder _FXShowPosixPathInTitle;killall Finder

为什么要这个路径,因为执行程序要这个路径,但发现无法复制,只能自己输入?

不会有这么鸡肋吧,发现有一个更加直接拷贝路径但方法,直接快捷键:

Command + Option + C就复制路径了

vi/vim 的简单使用

因为终端的编辑器是用vi编辑器,不会的小白,可不知道如何进行输入呢。

下面是这次要用到的一些命令。

  • 刚刚启动 vi/vim,便进入了命令模式

此时可输入的命令:

i  切换到插入模式,以输入字符。

x   删除当前光标所在处的字符。

:   切换到底线命令模式,以在最底一行输入命令。
  • 我们输入i,进入输入模式

在输入模式中,几乎跟我们正常使用一下,以下是使用按键

ENTER(回车键)   换行

BACK SPACE(退格键)   删除光标前一个字符

方向键   在文本中移动光标

HOME/END    移动光标到行首/行尾

Page Up/Page Down   上/下翻页

ESC   退出输入模式,切换到命令模式

当我们输入完内容,按ESC进入命令模式,然后按下 :(英文冒号)就可以进入底线命令模式保存退出了

  • 底线命令模式,按:(英文冒号)进入

基本的命令

q   退出程序

w   保存文件

最后按ESC键可随时退出底线命令模式。

重点用crontab创建定时任务

crontab是mac自带的。

我们需要用到的关键两个命令:

crontab -l //查看所有crontab 列表

crontab -e  //编辑crontab任务,保存退出后自动加到crontab列表中执行

重点是后者,我们在终端输入:

crontab -e

会显示如图:


mac下定时执行python程序(附不执行解决方案).md_第2张图片
image.png

红色框框就是要使用vi编辑器进行输入,用上面的教程即可操作。

接着看我们的示例:

15 9 * * python3 /Volumes/TRITY工作/redbooklog.py

这里都是代表上面意思呢?看下图:


mac下定时执行python程序(附不执行解决方案).md_第3张图片
image.png

所以我们上面那个例子的意思是:每天的9点15分,执行python3 ....这个命令。

当输入完成后,保存退出。系统自动建立新cron,提示如下:

crontab: installing new crontab

最后我们用下面命令,查询我们刚刚创建的话,是否创建成功

crontab -l

那怎么判定是否执行成功了呢?看下面

crontab 不执行怎么办

经过漫长的一天的等待,结果他不执行,果然是自己to young to simple。想得太简单了。另外一点,他执行是否成功也是不报任何的错误

下面进行自我的检查:

  • 首先我们看程序是否执行成功:

在终端输入:

python3 /Volumes/TRITY工作/redbooklog.py

发现没有问题。

  • 接着我们就考虑是否是crontab不执行呢?

我们找到这片文章:crontab 在mac上不执行问题研究

跟着步骤做下去,发现情况一模一样。关键代码摘录下:

# 定时任务统统由 launchctl 来管理的,看看 cron 任务有没有在里面
sudo launchctl list | grep cron 
# 有记录。查看一下启动项的配置
locate com.vix.cron
# 创建一个database
sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.locate.plist
# 查看 /etc/crontab 是否存在,文中用ll,我这没有此命令,用下面代替
ls -alF /etc/crontab
# 创建该文件
sudo touch /etc/crontab
  • 感觉我们大功告成了,于是又该回之前的代码
15 9 * * python3 /Volumes/TRITY工作/redbooklog.py

这次我聪明,下几个分钟的时间,坐等他执行.....

结果还是不执行?crontab参数设置错了?查询,没有。到底怎么错了?

  • 将两边的代码拆分自我的debug(分别是crontab和python)

测试crontab是否真的执行,于是下面代码产生:

# 每分钟输出当前时间到time.txt上.
*/1 * * * * /bin/date >> /User/Username(你的用户名)/time.txt 

一分钟去看,发现真的有。而且留意到这里的命令也是带绝对路径的:

考虑我们的python也得带上绝对路径,最后代码改成:

50 16 * * * /usr/local/bin/python3 /Volumes/TRITY工作/python/redbook/redbooklog.py

终于正常执行,终于解决了。

对应python3路径在哪,看这篇文章:Python2和python3在Mac OS上的安装位置

参考资料:

  • Mac终端 vi/vim 的简单使用
  • Mac Finder 显示路径和复制路径
  • Mac下使用crontab来实现定时任务
  • 10 个实用技巧,让 Finder 带你飞
  • Linux crontab定时执行任务 命令格式与详细例子
  • Mac 下不能停止掉 cron 吗?
  • crontab 在mac上不执行问题研究
  • Mac终端添加ll等命令

你可能感兴趣的:(mac下定时执行python程序(附不执行解决方案).md)