首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用launchctl时Cron任务错误

使用launchctl时Cron任务错误
EN

Stack Overflow用户
提问于 2014-09-22 14:05:11
回答 1查看 136关注 0票数 0

我有一个使用MySQL设置的这个剧本备份任务。

当我用sh /{FILEPATH}/backup.sh手动运行它时,它运行得很好,但是当我在LaunchDaemons中添加了一个带有任务的plist并将其加载到launchctl中时,它会抛出一个错误。

该任务开始运行(从备份MySQL数据库输出中可以看出),但是当它试图连接到数据库时会出错。

代码语言:javascript
复制
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

错误所在的行是:

代码语言:javascript
复制
$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

然后它在这个函数上再次出错:

代码语言:javascript
复制
function checkMysqlUp() {
    $MYSQL -N -h $HOST --user=$USER --password=$PASS -e status
}
trap checkMysqlUp 0

这是我的.plist文件

代码语言:javascript
复制
<?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时,我检查了多个线程的错误,并确保它具有正确的权限等等,并且文件路径也是绝对正确的(因为文件在错误之前就已经开始运行了)

EN

回答 1

Stack Overflow用户

发布于 2014-09-29 16:29:49

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

代码语言:javascript
复制
# mysql-backup.sh
28 MYSQL=${MYSQL:-`which mysql`}
29 MYSQLDUMP=${MYSQLDUMP:-`which mysqldump`}
30 PHP=${PHP:-`which php`}

而launchtl没有。(我相信which在什么都没有发现的时候对STDOUT保持沉默。)

Options

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

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

  1. 或者,可以通过调整和取消注释来显式地设置每个命令:

# (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的路径:launchctl环境操作 (如果这个脚本是您打算在系统上自动化的许多东西之一,那么这是有意义的)。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25976076

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档