使用Launchd每2分钟运行一次MAMP数据库备份

时间:2013-12-02 10:56:16

标签: launchd

  • 我正在尝试创建一个由launchd运行的plist文件。
  • 我希望它每2分钟运行一次(现在),它应该执行mysqldump备份。
  • 它用于备份我所有的本地MAMP数据库。
  • 剧本本身:

/Applications/MAMP/Library/bin/mysqldump --opt -u root -proot --host=localhost --all-databases > ~/Dropbox/Development/Shared\ DBs/BACKUPS/all_databases_-'date "+%Y-%m-%d_%H.%M.%S"'.sql

输入终端时

无问题。

  • 我需要自动执行此备份,因此请编写以下plist文件,并将其放入~/Library/LaunchAgents/com.localhost.cron.plist

  • 然后运行launchctl load ~/Library/LaunchAgents/com.localhost.cron.plist,但每2分钟没有触发。

知道我做错了吗?

<?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.localhost.cron.plist</string>
    <key>ProgramArguments</key>
    <array>
        <string>/Applications/MAMP/Library/bin/mysqldump --opt -u root -proot --host=localhost --all-databases > ~/Dropbox/Development/Shared\ DBs/BACKUPS/all_databases_-`date "+%Y-%m-%d_%H.%M.%S"`.sql</string>
    </array>
    <key>StartInterval</key>
    <integer>120</integer>
</dict>
</plist>

备注

我正在使用OS X Mavericks和最新的MAMP。

提前致谢。

修改

下面选择的答案很好地回答了我的问题,但我发现了我认为更好的方法(选择是你的)。它可以在这里找到:Send Stderr to dev/null but if no error occurs, continue on

1 个答案:

答案 0 :(得分:1)

您的ProgramArgument值不正确。你应该为每个参数提供一个额外的字符串。这应该更好:

<key>ProgramArguments</key>
<array>
    <string>/Applications/MAMP/Library/bin/mysqldump</string>
    <string>--opt</string>
    <string>-u</string>
    <string>root</string>
    <string>-proot</string>
    <string>--host=localhost</string>
    <string>--all-databases</string>
</array>

使用键StandardOutPath完成输出重定向,但~的shell扩展不起作用。 launchd也不允许shell命令创建动态文件名。你最好在shell脚本中包装所有这些,然后从launchd调用它。

为了仅在MySQL运行时运行此脚本,您可以使用KeepAlive键,如下所示:

<key>KeepAlive</key>
<dict>
    <key>PathState</key>
    <dict>
        <key>/var/run/mysql.pid</key>
        <true/>
    </dict>
</dict>

此方法假定您的MySQL实例将其当前PID写入文件/var/run/mysql.pid。该文件只在MySQL运行时才存在。

正确指出StartIntervalKeepAlive无法合作。无论PID文件是否存在,都会触发该脚本。正确的方法是使用ThrottleInterval而不是StartInterval。此键确定启动之间需要经过的时间。像这样使用它:

<ThrottleInterval>
<integer>120</integer>

看看launchd.plist(5)。它详细解释了所有选项。