我传递包含要获取的变量的文件路径作为我的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
我打印出“不是文件”。
我尝试在网上找到的每一个设置都可以解决这个问题:
我正在使用正确的用户设置crontab,脚本应该在其下运行。用户具有对文件位置的访问权限(通过从命令行运行脚本可以观察到)。
寻找有关下一步可以尝试的进一步建议。
答案 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中并不那么有文化。