Crontab源文件

最近我创build了一个bash脚本,我应该在cron中运行。

在准备好bash脚本及其正常工作之后,我把它放在Cron里,发现它是失败的。 作为第二步,我删除了所有的环境依赖关系,而不是只是file.txt ,我指定/home/blah-blah/file.txt

我仍然发现脚本仍然一步失败。 这一步是一个数据处理工具。 我执行的命令是/bin/blah-blah/processing_tool -parameter $INDEX其中$INDEX是在bash脚本中计算的一个variables。

第三步是在bash脚本的开头添加bashconfiguration文件作为源文件。 瞧!!!! 脚本从cron开始执行完美。

我的问题是为什么即使从我的脚本中删除所有的环境依赖关系后,这种情况发生。 另外我听说,不build议将cron作业提供给bashconfiguration文件。 如果是的话,还有什么方法可以避免这样做。

基本上来说:从cron开始的任何事情都从一个完全干净的石板开始。 对于环境变量的内容或任何从cron运行的脚本开始处的当前文件夹,您都不能做任何假设。

最简单的解决方案:cd到所需的目录,以确保您的路径在所需的位置。 源/ etc / profile来确保你得到系统范围的环境变量设置。 源〜myuserid / .profile来读取您的个人环境设置。 (〜/ .profile将无法正常工作,因为它会显示cron用户)。然后开始执行实际的脚本。 当然,上面的方法需要cron进程对您的home-dir进行读取访问,并且可能需要做更多的工作。

稍微复杂一些:找出脚本需要哪些环境变量以及脚本调用的任何东西。 在cron脚本的开头明确地导出这些文件。

(Ps替换/ etc / profile和〜myuserid / .profile与任何你选择的shell相对应的文件。)

一个cron可以被认为是一个单独的用户。 所以,这个“用户”可能不像你一样“看”或“读”相同的文件。 因此,所有的路径名称等绝对定义是至关重要的。

每个脚本都在自己的过程中运行。 所以,当你运行脚本的时候,你可以改变$SHELL和任何其他的变量,但是一旦你离开它,它将会丢失。 我的猜测是, $INDEX变量计算可能已经在脚本内成功计算出来,但是在脚本之外使用它可能失败了。 如果没有关于它是什么工作或者你想做什么的更多信息,很难说清楚。

有两种方法可以运行cron作业:

  1. 以root su -user -c < job > ,可以在root crontab运行su -user -c < job >
  2. 正如您所做的那样,明确地获取您的配置文件。
  3. 你也可以在crontab中设置环境变量。
  4. 作为用户crontab中的用户,您可以像这样运行它: "/home/blah/.profile && myScript"

也就是说,在你运行cron作业时,你的环境变量(除了文件扩展名之外)是不存在的。 您必须使用-x flag (in bash)执行该脚本,然后对输出进行细分。 在环境变量和root/cron环境变量之间使用diff可能是一个指针。 另外,请检查脚本中是否有某些实用程序正在使用,这些实用程序的位置不是$PATH cron / root的$PATH变量的一部分。