Bash Shell脚本和CRON问题
我已经为本地开发服务器(运行Ubuntu server edition 9.10)编写了一个备份脚本,只是一个简单的脚本,用于tar&gzip本地根目录并将其粘贴到备份文件夹中。 当我运行时,它工作正常:Bash Shell脚本和CRON问题,bash,shell,ubuntu,cron,Bash,Shell,Ubuntu,Cron,我已经为本地开发服务器(运行Ubuntu server edition 9.10)编写了一个备份脚本,只是一个简单的脚本,用于tar&gzip本地根目录并将其粘贴到备份文件夹中。 当我运行时,它工作正常: $ bash backups.sh 但当我通过crontab运行它时,它就不起作用了 59 23 * * * bash /home/vnc/backups/backup.sh >> /home/vnc/backups/backup.log 2> $1 我收到了错误信
$ bash backups.sh
但当我通过crontab运行它时,它就不起作用了
59 23 * * * bash /home/vnc/backups/backup.sh >> /home/vnc/backups/backup.log 2> $1
我收到了错误信息
/bin/sh: cannot create : nonexistent
脚本在运行tar.gz的文件夹(/home/user1)中创建tar.gz,然后尝试使用fstab将其从网络驱动器复制到已装载的共享(/home/backups,实际上是192.168.0.6/backups)。
装载的共享具有777权限,但所有者和组与运行脚本的所有者和组不同。
我使用bash来运行脚本,而不是sh来解决我过去遇到的另一个问题,即“错误替换”
文件的前两行是
! /bin/bash
cd /home/vnc/backups
我可能还没有提供足够的信息来完整回答这篇文章,但我可以根据需要发布更多信息,但我真的不知道下一步该去哪里。也许你在备份
时应该做的第一件事是插入cd/home/user1
crond
可能会从与您想象中不同的目录执行您的脚本,强制它使用相同的目录,而不管它是如何执行的,这可能是一个良好的开端
另一个可能有用的调试步骤是添加id>/tmp/id.$$
或类似的内容,以便您可以确切地看到正在使用哪个用户帐户和组来运行脚本。错误消息中有线索:
/bin/sh: cannot create : nonexistent
请注意,它说的是“sh”。Bourne shell不支持某些特定于Bash的特性。如果您使用的是Bash特性,那么需要告诉Bash运行脚本
创建文件的第一行:
#!/bin/bash
或者在crontab条目中执行以下操作:
* * * * * /bin/bash scriptname
如果看不到您的crontab条目和脚本,就很难更加具体。在crontab中,只需将2>$1更改为2>&1即可。我自己刚做了一个。谢谢丹尼斯·威廉姆森。我想区别在于环境。尝试将环境转储(通过设置
或通过声明
)到某个临时文件并进行比较。很可能它与工作目录或类似的东西有关。env
更适合打印环境信息,很抱歉误导您。我不确定需要比较什么?运行env
显示我正在使用/bin/bash/
,我没有尝试在任何地方使用/bin/sh/
,因此我无法理解错误与itI相关的原因我已经将cd放在文件的顶部,我将id>>this.log作为第一行添加到脚本中,但它甚至没有达到目的。你建议我在哪里把它添加到crontab文件?已经把这两行都放进去了!我会更新原始的postAh等一下,我在crontab中写了“bash”而不是“/bin/bash”,我会更新到绝对路径,看看它是如何工作的。。。好吧,那没什么区别either@Comcar:啊,我现在知道你的问题出在哪里了。crontab条目中没有要将标准输出发送到的$1
的内容。您需要指定一个文件名。使用$1
是没有意义的。在那种情况下没有意义。此外,在编辑中,shebang的名称为“!/bin/bash”。它必须是#/bin/bash
@Comcar:如果你想让stderr和stdout去同一个地方,那么它必须是2>&1
而不是“2>$1”。对不起,是的,我有#代码>,只是没有复制整行。我不敢相信这只是一个打字错误。由于$/&错误,crontab未运行。我真是个傻瓜。谢谢你,丹尼斯!这并不能真正回答为什么会出现这个错误的问题。他的原始代码是2>1美元,丹尼斯·威廉姆森对此做出了解释。