在cron中使用BASH的问题(FreeBSD)

场景:我们有一个运行FreeBSD 4.7的老式系统(请不要笑,在年底会退休,我只需要保持活跃状态​​并备份到那时),我有一些数据库转储脚本可以运行每天与一个cron工作。 我用#!/ usr / local / bin / bash开始脚本。 该脚本使用date命令将date作为转储文件的文件名的一部分。 当我手动运行脚本时,它按预期工作。 但是,当我把它放到一个cron工作,它失败了。 我检查了我的错误日志,它的脚本部分失败,我使用反引号和date命令的文件名(我也试过$(date…)在文件名,并给出了相同的错误。然后尝试在cronjob中添加/ usr / local / bin / bash /path/to/script.sh,它仍然有相同的错误。

所以我的猜测是,它运行时不会切换到bash shell。 我首先想到了在我的脚本中添加echo $ SHELL来查看,但我发现切换shell实际上并不切换SHELLvariables的值。

有没有人有类似的问题与FreeBSD? 或者是否有人知道另一种方法,我可以检查执行时使用哪个shell? (我也尝试了ps >> test.txt,并没有在cron中工作)。

在阅读本文时,出现了一些情况。

如果正在运行bash,那么$ BASH的值应该扩展到正在使用的bash可执行文件的完整path和文件名。

你怎么在你的脚本中调用date。 你是用完整的path名称还是“date”来调用它。 后面的情况可能会导致使用函数,别名,或任何碰巧在path中的第一个,而不是你期望的date程序。

在某些情况下,Bash的行为会因环境而异。 您可能希望将该环境转储到脚本中的文件,并从命令行和cron中查看它。 您可能会发现PATH是不同的,或者其他一些环境variables设置不同。 你应该可以通过在脚本中放置一行如“env> /tmp/environment.$$”来把它转储到/ tmp中的一个文件中。 每次脚本运行时,都会将环境打印到一个名为environment的文件中(脚本的pid)

你也可以通过使用“SHELL = / path / to / new / shell”来将整个crontab的shell设置为你想要的任何shell。

尝试明确地设置环境variables(例如PATH )或明确地获取启动文件(例如, /etc/profile/etc/profile /home/root/.profile /etc/profile /home/root/.profile或其他)。

如果你的cron假设另一个shell,你可能想要exec bash脚本。

至less某些版本的cron将'%'解释为特殊字符。 如果在crontab中使用date命令,我无法从上面的答案中得知。 请教你的手册页。 它的

 man 5 crontab 

另一个crontab手册页是针对crontab命令的,而不是文件的格式。

在Linux上,但我不知道在BSD。

如果是这样的话,你可以通过在其前面用\转义%来修复它。