使用launchctl时出现Cron任务错误

时间:2014-09-22 14:05:11

标签: cron plist sh

我使用this script设置了MySQL备份任务。

当我使用sh /{FILEPATH}/backup.sh手动运行它时运行正常,但是当我将任务的plist添加到LaunchDaemons并将其加载到launchctl时,它会抛出错误。

任务开始运行(由备份MySQL数据库输出证明),但在尝试连接数据库时出错。

From xxxx@xxxx.local  Wed Sep 17 07:00:03 2014
X-Original-To: xxxx
Delivered-To: xxxx@xxxx.local
From: xxxx@xxxx.local (Cron Daemon)
To: xxxx@xxxx.local
Subject: Cron <xxxx@xxxxc> /{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>

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

1 个答案:

答案 0 :(得分:0)

在常规登录shell中,它可以正常工作,因此您必须在路径中包含以下命令:

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

而launchtl没有。 (我相信当没有找到任何东西时,which对STDOUT保持沉默。)

选项

  1. 一个简单的通用解决方案是键入which mysqlwhich mysqldump以及which php以查找shell中的路径,然后添加路径:
  2. # mysql-backup.sh or mysql-backup.conf PATH=[path1]:[path2]:[path3]:$PATH

    1. 或者,您可以通过调整和取消注释来明确设置每个命令:
    2. # (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"

      1. 最后一种方法是修复launchtl的PATH: launchctl environment manipulation (如果此脚本是您打算在系统上自动化的许多内容之一,这是有道理的。)