Bash脚本没有在Cron中正确执行

时间:2012-01-11 00:08:50

标签: bash ubuntu cron execution

所以,我有一个bash脚本,它应该在每小时,每小时将ifconfig的输出传递给一个文本文件。正如许多人似乎遇到的那样,这个脚本在被cron使用时无法正常运行。但是,我所看到的大多数修复程序似乎都不适用于我的情况。我明确说明了所有路径,脚本具有执行权限,并且在cron文件的末尾有一个换行符。

创造性地,我的脚本ip.sh包含:

ifconfig > /home/drake/Dropbox/maintenance_scripts/ip.txt

cron条目是:

0 * * * *   /home/drake/Dropbox/maintenance_scripts/ip.sh

(我每分钟都在运行调试)

这里的BIG问题是,当它运行时,它确实运行,是它清除它可能具有的任何内容的ip.txt。另外,我有另一个脚本与正常运行时间做同样的事情,并且它适用于任何问题,这些问题一直困惑。我也尝试了>>,这似乎产生了相同的结果

那么,有没有人有任何想法为什么一个脚本可能会按预期运行,而另一个脚本会像这样解决?

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

3 个答案:

答案 0 :(得分:3)

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

cron运行内容时的常见问题是环境。请注意,当cron运行命令时,不使用该配置文件。

在这种情况下,我很遗憾cron下的PATH设置不包含ifconfig所在的目录(因此/sbin不在PATH上)。明显的解决方法:

  • /sbin/ifconfig ...
  • export PATH=$PATH:/sbin; ifconfig ...

我认为简单地从crontab文件运行脚本通常是开展业务的最佳方式。在不更改crontab设置的情况下,您可以添加调试代码,更改环境设置以及修改您心中的内容。摆弄crontab文件中的复杂命令行迟早会在某些系统或其他系统上遇到麻烦。所以我认为你的系统是明智的 - 我在自己的cron运行脚本中使用了一个更复杂的系统,但是有很多共性。关键点在于crontab条目很简单,并且运行的脚本是隐藏复杂性的地方。

答案 1 :(得分:3)

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

#!/bin/sh

虽然并非绝对必要。

该脚本会覆盖ip.txt,因为您告诉它。这就是>重定向运算符的作用。如果要追加到文件末尾,请使用>>。 (你说你试过了,结果相同。我怀疑那是真的。我怀疑cron的工作只是没有产生任何输出,所以它没有任何附加到文件。)

但是你不需要单独的脚本来进行重定向;您可以在cron作业中使用>>>

0 * * * *    ifconfig >> /home/drake/Dropbox/maintenance_scripts/ip.txt

至少在我的系统上,cron作业的默认$PATH/usr/bin:/bin,但ifconfig/sbin/ifconfig。试试which ifconfigtype 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

答案 2 :(得分:3)

尝试这个,它对我来说是从cron开始的。 请注意,ifconfig输出可以从Linux发行版更改为发行版,因此您可能需要调整awk选项。

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