所以,我有一个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来同步文本文件
答案 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 ifconfig
或type 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}'`