Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash Shell脚本和CRON问题_Bash_Shell_Ubuntu_Cron - Fatal编程技术网

Bash Shell脚本和CRON问题

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 我收到了错误信

我已经为本地开发服务器(运行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
我收到了错误信息

/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美元,丹尼斯·威廉姆森对此做出了解释。