在没有root权限的情况下,在Mac OS X上定期运行shell脚本

时间:2014-05-26 14:48:34

标签: macos bash cron startup launchd

我想在不使用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中的任何内容

有人可以帮我吗?

2 个答案:

答案 0 :(得分:24)

澄清: OP .plist文件本身完全没问题 - 问题原因是内部调用了shell脚本(未在问题中显示)。

在OS X上,使用由.plist加载并由守护程序管理器launchctl调用的launchd文件是首选调度方式(重复出现) )任务(详见下文)。

注意事项:

  • launchd
  • 中描述了.plist man launchd.plist个文件的格式
  • 对于每次当前用户登录时要加载的.plist文件,必须将其置于 ~/Library/LaunchAgents/ < / strong>(所有用户文件必须放在/Library/LaunchAgent/中 - 需要root权限。)
  • 使用键StandardOutPathStandardErrorPath指定输出捕获文件表示连续调用附加到指定的文件中,这意味着这些< strong>文件无限增长,除非在外部管理
  • 重新疑难解答:@Grady Player的建议适用:启动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)。

底线是:

  • 如果您来自* nix背景,您可能会更乐于继续使用croncrontab,假设:
    • 您已了解可能存在通过launchd安排的其他后台任务这一事实。
    • 您了解cron的限制,可以与他们一起工作。
  • 否则,在OS X上
    • 许多第三方应用使用原生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

希望这有帮助。