Bash脚本不能在Cron中正确执行

所以,我有一个bash脚本,应该在每小时一小时的时间将ifconfig的输出传递给一个文本文件。 正如很多人似乎遇到过的,这个脚本在被cron使用时不能正常工作。 不过,我所看到的大部分修正似乎并不适用于我的情况。 我明确指出所有的path,脚本具有执行权限,并在cron文件的末尾有一个换行符。

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

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

cron条目是:

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

(我每分钟都在运行debugging)

这里的BIG问题在运行时会运行,它会清除它可能具有的任何内容的ip.txt。 另外,我还有另外一个脚本,它和正常运行时间一样,没有任何问题,只是混淆了。 我也试过了>>,这似乎产生了相同的结果

所以,有没有人有任何想法,为什么一个脚本可能按预期发挥作用,而另一个脚本就会这样消失?

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

你的脚本应该在顶部有一个“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 

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

cron运行东西时的常见问题是环境 。 请注意,当cron运行一个命令时,配置文件不会被使用。

在这种情况下,我认为cron下的PATH设置不包括ifconfig所在的目录(so /sbin不在PATH中)。 明显的解决方法:

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

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

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

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