2014-09-22 54 views
0

我有使用this script设置的MySQL备份任务。使用launchctl时Cron任务错误

当我用sh /{FILEPATH}/backup.sh手动运行它时,它运行良好,但是当我将任务的plist添加到LaunchDaemons中并将其加载到launchctl时,它将引发错误。

该任务开始运行(如备份MySQL数据库输出),但在尝试连接数据库时发生错误。

From [email protected] Wed Sep 17 07:00:03 2014 
X-Original-To: xxxx 
Delivered-To: [email protected] 
From: [email protected] (Cron Daemon) 
To: [email protected] 
Subject: Cron <[email protected]> /{FILEPATH}/backup.sh 
X-Cron-Env: <SHELL=/bin/sh> 
X-Cron-Env: <PATH=/usr/bin:/bin> 
X-Cron-Env: <LOGNAME=xxxx> 
X-Cron-Env: <USER=xxxx> 
X-Cron-Env: <HOME=/Users/xxxx> 
Date: Wed, 17 Sep 2014 07:00:01 +0100 (BST) 

Loading config file (/{FILEPATH}/mysql-backup.conf) 
Backup directory exists (/{FILEPATH}/2014-09-17) 
Backing up MySQL databases... 
    - {database name}... 
/{FILEPATH}/backup.sh: line 82: --host=xx.xxx.xx.xx: command not found 
Error on or near line 79; exiting with status 1 
/{FILEPATH}/backup.sh: line 42: -N: command not found 

线的误差是是:

$MYSQLDUMP --host=$HOST --user=$USER --password=$PASS --default-character-set=utf8 --skip-set-charset --routines --disable-keys --force --single-transaction --allow-keywords $database > ${BACKDIR}/${SERVER}-MySQL-backup-$database-${DATE}.sql 

,然后再错误此功能:

function checkMysqlUp() { 
    $MYSQL -N -h $HOST --user=$USER --password=$PASS -e status 
} 
trap checkMysqlUp 0 

这是我的.plist文件

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
<plist version="1.0"> 
<dict> 
    <key>EnvironmentVariables</key> 
    <dict> 
     <key>LANG</key> 
     <string>en_US.UTF-8</string> 
    </dict> 
    <key>Label</key> 
    <string>local.database.backup</string> 
    <key>Program</key> 
    <string>/{FILEPATH}/backup.sh</string> 
    <key>StartCalendarInterval</key> 
    <dict> 
     <key>Hour</key> 
     <integer>00</integer> 
     <key>Minute</key> 
     <integer>07</integer> 
    </dict> 
</dict> 
</plist> 

我检查了错误w上的多个线程母鸡使用launchctl,并确保它具有正确的权限等,文件路径也是绝对正确的(因为该文件在错误发生之前开始运行)

回答

0

在您的常规登录shell中,它的工作原理是,您必须拥有这些命令在您的路径中:

# mysql-backup.sh 
28 MYSQL=${MYSQL:-`which mysql`} 
29 MYSQLDUMP=${MYSQLDUMP:-`which mysqldump`} 
30 PHP=${PHP:-`which php`} 

while launchtl does not。 (我相信当什么也没发现which是在标准输出上保持沉默。)

选项

  1. 一个简单的一般解决方法是键入which mysqlwhich mysqldumpwhich php找到你的shell的路径,然后添加的路径:

# mysql-backup.sh or mysql-backup.conf PATH=[path1]:[path2]:[path3]:$PATH

  • 或者,也可以通过调整和取消注释他们明确地设置每个命令:
  • # (mysql-backup.conf) 35 # Custom path to system commands (enable these if you want use a different 36 # location for PHP and MySQL or if you are having problems running this script) 37 PHP="/opt/local/bin/php" 38 MYSQL="/opt/local/bin/mysql" 39 MYSQLDUMP="/opt/local/bin/mysqldump"

  • 最后一种选择是固定launchtl的路径: launchctl environment manipulation (这使得感觉如果这个脚本是你打算在系统上自动化的许多东西之一)
  • +0

    谢谢lossleader,我从一个服务器卷运行备份,该服务器卷上没有定义路径名。我已决定将'sh'文件移动到本地桌面以保留路径,然后将备份保存到卷中。明天早上我会检查一下(一旦任务已经运行),以确认它是否是路径问题。 – 2014-09-30 16:37:13