Cron的工作不是"看到"一份文件

时间:2015-01-21 11:15:52

标签: bash cron file-access

我传递包含要获取的变量的文件路径作为我的Bash脚本的参数。 该文件是在Windows上创建的,以防万一。

执行以下检查:

CONFIG_FILE=$1
if [[ -f ${CONFIG_FILE} ]]; then 
    echo "Is a file"
    . ${CONFIG_FILE}
else
    echo "Not a file"
fi

当我从命令行手动运行脚本时,检查正常并且变量来源。

但是,当我使用

设置Cron作业时
*/1 * * * * /full/path/to/script.sh /full/path/to/configfile

我打印出“不是文件”。

我尝试在网上找到的每一个设置都可以解决这个问题:

  1. 在crontab和脚本本身(PATH& SHELL)中设置环境变量
  2. 在crontab(执行脚本之前)和脚本中获取配置文件( ./ etc / profile ./home/user/.bash_profile )本身。
  3. 尝试使用 -u user 参数运行crontab,但是没有权限(这没有意义,因为我已经以应该设置的用户身份登录crontab)
  4. 我正在使用正确的用户设置crontab,脚本应该在其下运行。用户具有对文件位置的访问权限(通过从命令行运行脚本可以观察到)。

    寻找有关下一步可以尝试的进一步建议。

2 个答案:

答案 0 :(得分:1)

你在这里做的是(我认为)确保你/path/config-file背后有一个单独的论点。您的原始问题似乎是在Unix上您的配置文件被声明为/path/config-file\r(请注意尾随\ r)。您是通过添加参数-q\r来完成的,这样配置文件本身就是回车的“干净”。您可以为此而不是blabla\r添加-q\r。你的脚本永远不会解释那个额外的论点;但是如果你把它放在cron线上,那么你的配置文件参数就是“受保护的”,因为它后面有东西,就是这样。

您还可以做的是确保您的cron定义是Unix样式(\n终止行)而不是DOS样式(\r\n终止行)。你的Unix机器上可能有一个实用程序dos2unix来实现它。

或者您可以使用crontab -r删除Unix上的crontab,然后使用crontab -e重新创建crontab。只是不要上传在MS-DOS(或派生)上创建的文件。

答案 1 :(得分:0)

发现了另一次尝试并且有效。 我在cronjob行中添加了-q标志。

*/1 * * * * /path/script.sh /path/config-file -q

来源:Cron Job error "Could not open input file"

有人可以向我解释它有什么作用吗? 我在bash中并不那么有文化。