/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
答案 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运行时才存在。
正确指出StartInterval
和KeepAlive
无法合作。无论PID文件是否存在,都会触发该脚本。正确的方法是使用ThrottleInterval
而不是StartInterval
。此键确定启动之间需要经过的时间。像这样使用它:
<ThrottleInterval>
<integer>120</integer>
看看launchd.plist(5)
。它详细解释了所有选项。