最近我创建了一个bash脚本,我应该在cron中运行。
准备好bash脚本及其正常工作后,我把它放在Cron中,发现它失败了。与第二步一样,我删除了所有环境依赖项,而不仅仅是file.txt
,我指定了/home/blah-blah/file.txt
我仍然发现脚本仍在一步失败。该步骤是一种数据处理工具。
我执行的命令是/bin/blah-blah/processing_tool -parameter $INDEX
,其中$INDEX
是在bash脚本中计算的变量。
第三步是在bash脚本的开头添加bash配置文件作为源。瞧!!!!该脚本从cron开始完美执行。
我的问题是,为什么即使在我从脚本中删除了所有环境依赖项后,也会发生这种情况。我也听说不建议将bron作业转换为bash配置文件。如果是这样,有没有其他方法可以避免这样做。
答案 0 :(得分:2)
基本上:从cron开始的任何东西都是以完全干净的方式开始的。 您不能对环境变量的内容或任何从cron运行的脚本开头的当前文件夹中的任何文件夹做任何假设。
最简单的解决方案: cd到所需的目录,以确保您的路径在所需的位置。 源/ etc / profile确保您获得系统范围的环境变量设置。 source~myuserid / .profile来读取您的个人环境设置。 (〜/ .profile将不起作用,因为它表示cron用户。) 然后开始执行实际的脚本。 当然,上面的方法要求cron进程具有对你的home-dir的读访问权,并且它可能正在做更多的实际需要的工作。
稍微复杂一点:弄清楚脚本需要哪些环境变量以及脚本调用的任何内容。 在cron脚本的开头明确地导出它们。
(P.s。替换/ etc / profile和~myuserid / .profile以及所选shell的相应文件。)
答案 1 :(得分:0)
可以将cron
视为单独的用户。因此,这个“用户”可能不会“看到”或“读取”与您相同的文件。因此,必须以绝对值定义所有路径名等。
每个脚本都在自己的进程中运行。因此,当您运行脚本时,您可以更改$SHELL
和其中的任何其他变量,但一旦您退出它就会丢失。我的猜测是$INDEX
变量计算可能已在脚本中成功计算,但在脚本之外的使用可能已失败。如果没有关于它是什么工作或者你想做什么的更多信息,很难说清楚。
运行cron作业有两种方法:
su -user -c < job >
中运行root crontab
。 "/home/blah/.profile && myScript"
也就是说,当你运行cron作业时,你的环境变量(除了文件扩展名)之外就不存在了。您必须使用-x flag (in bash)
执行该脚本,然后对输出进行细化。在您的环境变量和diff
之间使用root/cron
可能是一个指针。另外,检查脚本中是否存在某些实用程序,这些实用程序的位置不属于cron / root的$PATH
变量。