Bash脚本未在Cron中正确执行

Bash脚本未在Cron中正确执行,bash,ubuntu,cron,execution,Bash,Ubuntu,Cron,Execution,因此,我有一个bash脚本,它应该每小时将ifconfig的输出通过管道传输到一个文本文件。正如许多人似乎都遇到过的那样,这个脚本在被cron使用时无法正常工作。然而,我看到的大多数解决方法似乎不适用于我的情况。我明确说明了所有路径,脚本具有执行权限,并且cron文件末尾有一个换行符 富有创意的是,我的纸条ip.sh包含: ifconfig > /home/drake/Dropbox/maintenance_scripts/ip.txt cron条目是: 0 * * * * /hom

因此,我有一个bash脚本,它应该每小时将ifconfig的输出通过管道传输到一个文本文件。正如许多人似乎都遇到过的那样,这个脚本在被cron使用时无法正常工作。然而,我看到的大多数解决方法似乎不适用于我的情况。我明确说明了所有路径,脚本具有执行权限,并且cron文件末尾有一个换行符

富有创意的是,我的纸条ip.sh包含:

ifconfig > /home/drake/Dropbox/maintenance_scripts/ip.txt
cron条目是:

0 * * * *   /home/drake/Dropbox/maintenance_scripts/ip.sh
我让它每分钟运行一次以进行调试

这里最大的问题是,当它运行时,它确实运行了,它会清除ip.txt中可能包含的任何内容。另外,我还有另一个脚本,它在正常运行时间上做同样的事情,它可以在没有任何问题的情况下工作,这只是有点混乱。我还尝试了>>,这似乎产生了相同的结果

那么,有没有人知道为什么一个脚本可以像预期的那样工作,而另一个脚本会像这样被删除

这是在我的Ubuntu服务器上运行的。我正在使用Dropbox同步文本文件

ip.sh脚本应该在每次运行时都会对ip.txt文件进行处理;然后由ifconfig程序重新填充它。所以,您的问题是ifconfig没有这样做

从cron运行东西时,通常的问题是环境。请注意,当cron运行命令时,不使用概要文件

在这种情况下,我认为cron下的PATH设置可能不包括ifconfig所在的目录,因此/sbin不在PATH上。显而易见的解决办法:

/sbin/ifconfig。。。 导出路径=$PATH:/sbin;ifconfig。。。
我认为简单地从crontab文件运行脚本通常是做生意的最佳方式。在不更改crontab设置的情况下,您可以添加调试代码、更改环境设置,或者修改您的核心内容。在crontab文件中处理复杂的命令行迟早会在某些系统或其他系统上遇到麻烦。因此,我认为您的系统是合理的——我在自己的cron运行脚本中使用了一个稍微复杂一些的系统,但有很多共性。关键是crontab条目很简单,运行的脚本隐藏了复杂性。

您的脚本顶部应该有一行shebang:

#!/bin/sh
虽然这不是绝对需要的

脚本会覆盖ip.txt,因为您告诉它。这就是>重定向操作符所做的。如果要附加到文件末尾,请使用>>。你说你试过了,结果是一样的。我怀疑那是真的。我怀疑cron作业没有生成任何输出,因此它没有向文件追加任何内容

但是你不需要一个单独的脚本来重定向;您可以在cron作业本身中使用>或>>:

0 * * * *    ifconfig >> /home/drake/Dropbox/maintenance_scripts/ip.txt
至少在我的系统上,cron作业的默认$PATH是/usr/bin:/bin,而ifconfig是/sbin/ifconfig。尝试使用哪个ifconfig或键入ifconfig来查看ifconfig在您的系统中的位置我们都在使用Ubuntu,所以它可能是相同的,并使用cron作业中的完整路径;例如:

0 * * * *    /sbin/ifconfig >> /home/drake/Dropbox/maintenance_scripts/ip.txt
如果您想查看输出何时更改,我想这就是您要检查的内容,添加时间戳非常简单:

0 * * * *    ( date ; /sbin/ifconfig ) >> /home/drake/Dropbox/maintenance_scripts/ip.txt

试试这个,它从cron那里为我工作。 请注意,ifconfig输出可能会随着Linux发行版的不同而变化,因此您可能需要调整awk选择

# Cron ifconfig piping is broken
eth0ipIC=`/sbin/ifconfig eth0`
eth0ip=`echo $eth0ipIC|awk '{print $7}'|awk -F: '{print $2}'`

啊,我知道一定是这样的。它实际上位于/sbin/中,并将其更改为/sbin/ifconfig会使事情变得正确。您可以通过单击旁边的复选标记图标来接受正确的答案。一旦你有了15个不需要太长时间的声望点,如果你愿意,你也可以投票给一个或多个答案。