我想在不使用root的情况下在mac os x上启动.sh类型或.py文件, 我在谷歌搜索,发现launchctl可以帮助我,
所以我阅读教程并在教程中做同样的事情,但它对我不起作用,[我使用mac os x 10.9 x64]
我的.plist文件[每隔60秒运行1.sh文件]:
<?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.plist放在/Users/paul/Run.plist
中并从终端运行命令:
launchctl load /Users/paul/Run.plist
Launchctl start com.alvin.crontabtest
命令执行没有任何错误,但我没有看到 working.txt中的任何内容
有人可以帮我吗?
答案 0 :(得分:24)
澄清: OP .plist
文件本身完全没问题 - 问题原因是内部调用了shell脚本(未在问题中显示)。
在OS X上,使用由.plist
加载并由守护程序管理器launchctl
调用的launchd
文件是首选调度方式(重复出现) )任务(详见下文)。
注意事项:
launchd
.plist
man launchd.plist
个文件的格式
.plist
文件,必须将其置于 ~/Library/LaunchAgents/
< / strong>(所有用户文件必须放在/Library/LaunchAgent/
中 - 需要root权限。)StandardOutPath
和StandardErrorPath
指定输出捕获文件表示连续调用将附加到指定的文件中,这意味着这些< strong>文件无限增长,除非在外部管理。Console.app
并查找com.apple.launchd.peruser
条目 - 无法调用.plist
中指定的命令将显示在那里。 @ghoti's answer描述了一般Unix替代到launchd
, cron
(通常在Linux上使用):
至于cron
与OS X的关系:@ghoti问:
您不想使用普通的crontab吗?
在OS X上,man crontab
建议(强调添加):
虽然正式支持cron(8)和crontab(5) 在Darwin [OS X]下,他们的功能已被吸收到launchd(8)中, 它提供了一种更灵活的自动执行命令的方式。 有关更多信息,请参阅launchctl(1)。
底线是:
cron
和crontab
,假设:
launchd
安排的其他后台任务这一事实。cron
的限制,可以与他们一起工作。launchd
功能,因此通过.plist
(适用于所有用户)或/Library/LaunchAgents
中的~/Library/LaunchAgents
文件指定定期后台任务(适用于当前用户)。launchd
提供的更高灵活性,请通过{{指定后台任务1}}由.plist
评估的文件。添加简单 launchd
任务可能比为cron
创建.plist
文件更简单,但第三方实用程序(例如Lingon 3)可以提供帮助与后者。
此外,调用launchd
任务与每用户cron
任务的方式存在细微差异:例如,前者不允许通过AppleScript进行用户交互而后者呢。
案例确实增加了launchd
的灵活性:OP在后续评论中要求每隔 30 秒运行任务:
launchd
任务的最短间隔为60秒,需要在@ ghoti的答案中采用解决方法。
相比之下,使用cron
launchd
文件,将.plist
更改为<key>StartInterval</key><integer>60</integer>
即可。
答案 1 :(得分:7)
您不想使用普通的crontab吗?
% echo "* * * * * /Users/paul/Desktop/1.sh" | crontab -
此命令应添加每分钟运行一次的cron作业。
请注意,此命令也将替换您已有的任何crontab。 crontab -
命令应谨慎使用,作为快捷方式。
如果要编辑现有的crontab,以避免删除以前设置的作业,可以使用crontab -e
。 (如果它启动vim
并且您不知道如何使用vim
,则可以通过点击 ESC 退出: q < / kbd> ! 输入然后去查找编辑器文档。)
如果您需要有关如何编辑crontabs的说明,请在shell中键入man crontab
。如果您需要有关crontab文件的语法信息,man 5 crontab
将向您显示。
享受!
更新:(根据评论)
每30秒运行一次工作需要一个简单的黑客攻击。 Cron只能按分钟运行作业,所以每30秒运行一次,你可以有两个作业,其中一个有30秒的延迟。例如:
#Mn Hr Da Mo DW Command
* * * * * /Users/paul/Desktop/1.sh
* * * * * sleep 30; /Users/paul/Desktop/1.sh
希望这有帮助。