我想在mac os x上以。sh类型或。py类型启动文件,而不使用root,我在谷歌搜索,发现launchctl可以帮助我,
所以我阅读教程并在教程中做同样的事情,但它不适合我,[我使用MAC OS x 10.9 x64]
My .plist file[每60秒运行1.sh file]:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.alvin.crontabtest</string>
<key>ProgramArguments</key>
<array>
<string>/Users/paul/Desktop/1.sh</string>
</array>
<key>Nice</key>
<integer>1</integer>
<key>StartInterval</key>
<integer>60</integer>
<key>RunAtLoad</key>
<true/>
<key>StandardErrorPath</key>
<string>/tmp/AlTest1.err</string>
<key>StandardOutPath</key>
<string>/tmp/AlTest1.out</string>
</dict>
</plist>
1.sh:
echo '+' >> /Users/paul/Desktop/worked.txt
我放了Run。/Users/paul/Run.plist
和从终端运行命令:
launchctl load /Users/paul/Run.plist
Launchctl start com.alvin.crontabtest
命令执行没有任何错误,但我没有看到working .txt
有谁能帮我吗?
澄清:OP的.plist
文件本身是完全OK的 -问题原来是内部的 shell脚本调用(未显示在问题中)。
在OS X上,使用由CLI launchctl
加载并由守护进程管理器launchd
调用的.plist
文件是首选的调度(循环)任务的方法(更多信息请参见下文)。
注意事项:
-
launchd
.plist
文件的格式见man launchd.plist
-
对于每次当前用户登录时加载的
.plist
文件,必须放在~/Library/LaunchAgents/
中(所有用户文件必须放在/Library/LaunchAgent/
中-需要root权限)。 -
使用密钥
StandardOutPath
和StandardErrorPath
指定输出捕获文件意味着连续调用将追加到指定的文件,这意味着这些文件将无限增长,除非外部管理。 - Re 故障排除: @Grady Player的建议适用:启动
Console.app
并查找com.apple.launchd.peruser
条目-调用.plist
中指定的命令失败将显示在那里。
@ghoti的回答描述了一个通用Unix替代 launchd
, cron
(通常在Linux上使用):
关于cron
与OS X的关系:@ghoti问:
有什么特别的原因你不想使用一个普通的crontab吗?
在OS X上,man crontab
建议(强调添加):
虽然官方支持cron(8)和crontab(5)在Darwin [OS X]下,它们的功能已被吸收到laund (8)中,它提供了更灵活的方式来自动执行命令。更多信息请参见launchctl(1)。
的底线是:
-
如果您来自*nix背景,您可能更适合继续使用
cron
和crontab
,假设:- 你知道通过
launchd
调度的额外后台任务可能存在。 - 你知道
cron
的局限性,并且可以使用/绕过它们。
- 你知道通过
-
否则,在OS X上:
- 许多第三方应用程序使用本地
launchd
功能,从而通过/Library/LaunchAgents
(所有用户)或~/Library/LaunchAgents
(当前用户)中的.plist
文件指定周期性后台任务。 - 如果你想集中管理后台任务到这些位置和/或你想利用
launchd
提供的增加的灵活性,通过launchd
评估的.plist
文件指定后台任务。
- 许多第三方应用程序使用本地
添加简单的 cron
任务可能比为launchd
创建.plist
文件更简单,但第三方实用程序(如Lingon 3)可以帮助实现后者。
同样,在cron
任务和每用户launchd
任务的调用方式上有细微的区别:例如,前者不允许用户通过AppleScript进行交互,而后者允许。
launchd
增加灵活性的例子:OP在后续评论中要求任务每30秒运行一次:
-
cron
任务的最小间隔为60秒,需要在@ghoti的回答中进行变通。 -
与
launchd
.plist
文件相比,将<key>StartInterval</key><integer>60</integer>
更改为<key>StartInterval</key><integer>30</integer>
就足够了。
您有什么特别的原因不想使用普通的crontab吗?
% echo "* * * * * /Users/paul/Desktop/1.sh" | crontab -
该命令应该添加一个每分钟运行一次的cron作业。
注意,该命令还将替换您已有的任何crontab。 crontab -
命令应该谨慎使用,作为一个快捷方式。
如果要编辑现有的crontab,以避免删除先前设置的作业,可以使用crontab -e
。(如果它启动vim
,你不知道如何使用vim
,你可以退出按ESC:q!输入,然后找到编辑器文档)
如果您想了解如何编辑crontab,请在shell中输入man crontab
。如果您需要有关crontab文件的语法信息,man 5 crontab
将向您显示。
享受吧!
UPDATE: (per comments)
每30秒运行一次作业需要一个简单的hack。Cron只以每分钟为单位运行作业,因此要每30秒运行一次,您可以有两个作业,其中一个具有30秒的延迟。例如:
#Mn Hr Da Mo DW Command
* * * * * /Users/paul/Desktop/1.sh
* * * * * sleep 30; /Users/paul/Desktop/1.sh