Bash脚本不能在Cron中正确执行
所以,我有一个bash脚本,应该在每小时每小时将ifconfig的输出传递给一个文本文件。正如许多人似乎遇到的一样,该脚本在被cron使用时不能正常工作。但是,我所看到的大部分修复方法似乎并不适用于我的情况。我明确指出所有路径,脚本具有执行权限,并且cron文件末尾有一个换行符。Bash脚本不能在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来同步文本文件
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条目很简单,运行的脚本就是隐藏复杂性的地方。
你的脚本应该具有在顶部有一个“认领”行:
#!/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
尝试这一个,它从我的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将事物设置正确。 – Drake 2012-01-11 00:29:28
您可以通过点击旁边的复选标记图标来接受正确答案。一旦你有15个声望点(这不应该花很长时间),如果你愿意的话,你也可以提出一个或多个答案。 – 2012-01-11 00:45:52