为 CRON 分配环境变量

为 CRON 分配环境变量

我有一个.sh脚本,可以创建一个文件并使用密钥进行身份验证.tar.gz将其传输到远程服务器。RSA

该脚本将会运行,terminal但是当我尝试将其设置为一项Cron作业时它却不会运行。

我收到一封电子邮件,Cron Daemon指出此失败:“ /bin/sh: /home/backup.sh: Permission denied”,并且文件未传输到其他服务器。

我已经确定了最可能的原因这个 askubuntu 帖子这很可能是因为“ Cron”向您的作业传递了一组最少的环境变量。

解决办法似乎是包括

#!/bin/bash
PATH=/opt/someApp/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

# rest of script follows

如能提供关于如何配置此功能的任何帮助,我们将不胜感激。

我在跑步Ubuntu Server 11.04

编辑:ls -la backup.sh 给出 -rw-r--r-- 1 root root 1053 2012-10-13 15:08 backup.sh

答案1

感谢您ls的输出。看来 cron 对文件没有正确权限的抱怨可以从表面上理解(具体来说,它缺乏执行权限);尝试这样做chmod 755 ./home/backup.sh,看看是否有帮助。

编辑:我很高兴我们解决了这个问题。首先,您应该查看哪个用户在 cron 下运行此作业,并检查 backupdir 目录的所有权。用户需要具有在该目录中写入的权限;盲目地chmod做事是没有用的。

答案2

“权限被拒绝”消息似乎表明 cron 运行脚本的用户没有适当的权限访问该脚本 /home/backup.sh

检查正在使用 crontab 的用户是否至少拥有r-x/home 和 backup.sh。

答案3

您可以在 crontab 中设置任何您喜欢的环境变量。一种方法是在 crontab 文件中放入一行,格式如下

varname=value

然后,该环境变量将为文件中该行之后出现的任何 cron 作业设置。如果您想确保它仅适用于该命令,只需将变量声明放在命令的开头,就像在控制台上更改一个命令的变量一样:

varname=value command

所以它可能看起来像

0 5 * * * varname=value command

对于个人 crontab 或

0 5 * * * root varname=value command

对于系统一来说。

注意:我已经回答了您的问题,但其他人是对的,这可能不是导致您出现问题的原因。

答案4

在这种情况下,最好将其附加到 $PATH 而不是覆盖它。

PATH=${PATH}:/others/bin

您还可以使用以下命令调试 PATH 变量的设置

#!/usr/bin/env bash
logger "Path-dump: "${PATH}

您可以检查 /var/log/syslog 中的输出,您应该会看到一些输出

cat /var/log/syslog | grep "Path-dump"

相关内容