Mac 开启定时任务 crontab

本文介绍了如何在Mac上设置定时任务,主要使用crontab进行配置。通过`launchctl`启动cron服务,然后编辑crontab文件以定时执行指定的脚本或系统指令。文章详细讲解了crontab的常用命令和cron表达式的用法,举例说明了每隔一分钟运行Go程序的设置方法,并提供了查看和解决执行问题的技巧。

1 定时任务        

有时候会遇到这种情况,需要定期执行一下某个脚本文件,此时可以考虑定时任务。

设置定时任务:

linux/mac下的定时执行主要是使用crontab文件中加入定制计划来执行,Cron本身是一个守护进程,在后台运行,通过配置文件“crontab”来根据时间调度指定的作业执行。

mac 有两种定时任务,我使用的是第一种:

  • crontab 命令 (linux同样支持)
  • launchctl 定时任务

启动cron

基本上所有的Linux发行版在默认情况下都预安装了cron工具。即使未预装cron,也很简单,执行命令手动安装它:

$ sudo apt-get install cron
$ service cron start 
$ service cron status  
cron start/running, process 1027    

查看 crontab 是否启动

sudo launchctl list | grep cron

检查需要的文件

LaunchAgents  ll /etc/crontab
ls: /etc/crontab: No such file or directory  #表示没有这个文件,需要创建一个

创建文件

sudo touch /etc/crontab 
 

通过crontab 命令,我们可以在固定的间隔时间执行指定的系统指令或 shell script脚本。时间间隔的单位可以是分钟、小时、日、月、周及以上的任意组合。

crontab命令后可以加参数:

  • -u user:用来设定某个用户的crontab服务;
    file:file是命令文件的名字,表示将file做为crontab的任务列表文件并载入crontab。如果在命令行中没有指定这个文件,crontab命令将接受标准输入(键盘)上键入的命令,并将它们载入crontab。
  • -e:编辑某个用户的crontab文件内容。如果不指定用户,则表示编辑当前用户的crontab文件。
  • -l:显示某个用户的crontab文件内容,如果不指定用户,则表示显示当前用户的crontab文件内容。
  • -r:从/var/spool/cron目录中删除某个用户的crontab文件,如果不指定用户,则默认删除当前用户的crontab文件。
  • -i:在删除用户的crontab文件时给确认提示。

常用crontab命令

$ crontab –l #列出当前用户的任务列表
$ crontab –l –u username #列出指定用户的任务列表
$ crontab -e  #编辑任务列表
$ crontab -ri #提示性删除当前用户的任务列表

cron表达式

* * * * * command to be executed 
- - - - - - 
| | | | | | 
| | | | | --- 预执行的命令 
| | | | ----- 表示星期0~7(其中星期天可以用0或7表示) 
| | | ------- 表示月份1~12 
| | --------- 表示日期1~31 
| ----------- 表示小时1~23(0表示0点) 
------------- 表示分钟1~59 每分钟用*或者 */1表示 

#==========以下是例子============
30 21 * * * /usr/local/etc/rc.d/lighttpd restart 
每晚的21:30重启apache

45 4 1,10,22 * * /usr/local/etc/rc.d/lighttpd restart 
每月1、10、22日的4:45重启apache

10 1 * * 6,0 /usr/local/etc/rc.d/lighttpd restart 
每周六、周日的1:10重启apache

0,30 18-23 * * * /usr/local/etc/rc.d/lighttpd restart 
每天18:00至23:00之间每隔30分钟重启apache

0 23 * * 6 /usr/local/etc/rc.d/lighttpd restart 
每星期六的23:00重启apache

* */1 * * * /usr/local/etc/rc.d/lighttpd restart 
每一小时重启apache

* 23-7/1 * * * /usr/local/etc/rc.d/lighttpd restart 
晚上11点到早上7点之间,每隔一小时重启apache

0 11 4 * mon-wed /usr/local/etc/rc.d/lighttpd restart 
每月的4号与每周一到周三的11点重启apache

0 4 1 jan * /usr/local/etc/rc.d/lighttpd restart 
一月一号的4点重启apache

0 17 * * 1-5 mail -s "hi" alex@domain.name < /tmp/maildata
周一到周五每天17:00寄一封信给alex@domain.name

当使用 crontab -e 命令后。即可进入编辑界面,可以输入“  *  *  *  *  *  myCommand # 分+ 时+ 日+ 月+ 星期+ 要运行的命令 ”。我这里运行了:

*/1 * * * * cd 绝对路径/order_promotion_alarm/ && /usr/local/Cellar/go/1.11.5/libexec/bin/go run 绝对路径/order_promotion_alarm/sync_alarm.go

上一句表示先切到项目某个文件目录下,然后每隔一分钟,运行一下sync_alarm.go这个文件。由于一开始上面命令一直不执行成功,所以就切到记录运行信息的文件里看了一下,执行命令 cat  /private/var/mail/用户名 ,会显示运行信息。类似下面这种:

From 用户名@bogon.localdomain  Thu Mar 14 14:20:02 2019
Return-Path: <用户名@bogon.localdomain>
X-Original-To: 用户名
Delivered-To: 用户名@bogon.localdomain
Received: by bogon.localdomain (Postfix, from userid 501)
	id DE490353130; Thu, 14 Mar 2019 14:20:02 +0800 (CST)
From: 用户名@bogon.localdomain (Cron Daemon)
To: 用户名@bogon.localdomain
Subject: Cron <用户名@bogon> cd 绝对路径/order_promotion_alarm/ && /usr/local/Cellar/go/1.11.5/libexec/bin/go run 绝对路径/order_promotion_alarm/sync_alarm.go
X-Cron-Env: <SHELL=/bin/sh>
X-Cron-Env: <PATH=/usr/bin:/bin>
X-Cron-Env: <LOGNAME=用户名>
X-Cron-Env: <USER=用户名>
X-Cron-Env: <HOME=/Users/用户名>
Message-Id: <20190314062002.DE490353130@bogon.localdomain>
Date: Thu, 14 Mar 2019 14:20:02 +0800 (CST)

Info 2019-03-14 14:20:02,143 v1(6) stress_testing.go:51。。。。。。等等

参考:

http://www.page.keyllo.com/linux/2016/12/12/linux-mac-crontab.html

https://blog.youkuaiyun.com/biyongyao/article/details/77791238

https://talk.ninghao.net/t/mac/5447

 

<think>好的,我现在需要帮助用户解决crontab定时任务中遇到的“Operation not permitted”权限问题。首先,我要回忆一下用户提供的引用内容,看看有哪些相关的解决方案。 用户提供的引用中有几个关键点。引用[1]提到使用lsattr检查文件属性,发现可能有i属性导致无法修改,需要用chattr -ia去除。引用[2]指出在MacOS Mojave中需要系统权限设置,可能需要进入系统偏好设置的安全性与隐私中添加终端权限。引用[3]提到错误日志的问题,可能需要检查输出重定向是否正确。引用[4]涉及高版本MacOS的权限问题,使用chown可能无效,需要关闭SIP。引用[5]则建议检查脚本的执行权限,用chmod添加执行权限。 接下来,我需要将这些信息整合成一个清晰的解决步骤。首先应该检查文件属性和权限,特别是/var/spool/cron相关文件是否有i属性。然后,如果是Mac用户,可能需要调整系统权限或关闭SIP。此外,还要确保脚本本身有执行权限,并正确输出日志以便排查问题。 需要注意的是,用户可能使用的是Linux或Mac,不同系统解决方案可能不同。比如Mac的高版本需要处理SIP,而Linux可能更多是文件属性问题。因此,在步骤中需要区分不同情况,给出对应的解决方法。同时,要提醒用户谨慎操作,特别是修改系统文件或关闭SIP可能有风险。 最后,生成相关问题时要覆盖常见的情况,比如如何检查权限、其他错误如No such file或Permission denied的解决办法,以及MacOS特有的处理方式。</think>### crontab "Operation not permitted" 权限问题解决方案 #### 1. 检查文件属性锁 (Linux/Unix系统) - 使用 `lsattr` 命令检查关键文件是否被锁定: ```bash lsattr /var/spool/cron # 检查目录属性 lsattr /var/spool/cron/root # 检查用户任务文件 ``` - 如果显示含 `i` 属性(不可修改标志),执行解锁: ```bash chattr -ia /var/spool/cron chattr -ia /var/spool/cron/root ``` 此时可尝试重新执行 `crontab -r`[^1] #### 2. MacOS系统权限配置 (10.14+) 1. 进入 **系统偏好设置 > 安全性与隐私 > 隐私** 2. 在左侧栏选择 **完全磁盘访问权限** 3. 点击左下角解锁按钮后,添加终端/Terminal到许可列表[^2] 4. 重启终端后重试 #### 3. 系统完整性保护(SIP)问题 对于MacOS Catalina及以上版本: 1. 重启电脑,按住 `Command + R` 进入恢复模式 2. 打开终端执行: ```bash csrutil disable ``` 3. 重启后重试操作(注意:关闭SIP会降低系统安全性,操作后建议重新启用)[^4] #### 4. 脚本权限验证 确保执行的脚本具有可执行权限: ```bash chmod +x /path/to/script.sh # 添加执行权限 ``` 使用完整路径调用脚本: ```bash */5 * * * * /bin/bash /full/path/script.sh >> /logs/file.log 2>&1[^5] ``` #### 5. 日志排查技巧 使用显式错误输出定位问题: ```bash */5 * * * * /path/script.sh > /tmp/cron.log 2>&1 ``` 查看日志文件分析具体错误: ```bash tail -f /tmp/cron.log ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值