我有一个.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"