在Mac OS X操作系统下,不需要root权限,定期运行shell脚本



我想在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权限)。
  • 使用密钥StandardOutPathStandardErrorPath指定输出捕获文件意味着连续调用追加到指定的文件,这意味着这些文件将无限增长,除非外部管理
  • 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背景,您可能更适合继续使用croncrontab,假设:
    • 你知道通过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

最新更新