我有一个crontab每小时运行一次。运行它的用户在.bash_profile中有环境变量,当用户从终端运行作业时,这些环境变量是有效的,然而,显然这些环境变量在crontab运行时不会被拾取。
我已经尝试在.profile和.bashrc中设置它们,但它们似乎仍然没有被拾取。有人知道我可以把crontab可以获取的环境变量放在哪里吗?
我有一个crontab每小时运行一次。运行它的用户在.bash_profile中有环境变量,当用户从终端运行作业时,这些环境变量是有效的,然而,显然这些环境变量在crontab运行时不会被拾取。
我已经尝试在.profile和.bashrc中设置它们,但它们似乎仍然没有被拾取。有人知道我可以把crontab可以获取的环境变量放在哪里吗?
当前回答
在@carestad示例的基础上展开(我觉得更简单),使用cron运行脚本,并将环境放在脚本中。
在crontab -e文件中:
SHELL=/bin/bash
*/1 * * * * $HOME/cron_job.sh
cron_job.sh文件:
#!/bin/bash
source $HOME/.bash_profile
some_other_cmd
.bash_profile源文件后面的任何命令都将拥有您的环境,就像您登录了一样。
其他回答
在@carestad示例的基础上展开(我觉得更简单),使用cron运行脚本,并将环境放在脚本中。
在crontab -e文件中:
SHELL=/bin/bash
*/1 * * * * $HOME/cron_job.sh
cron_job.sh文件:
#!/bin/bash
source $HOME/.bash_profile
some_other_cmd
.bash_profile源文件后面的任何命令都将拥有您的环境,就像您登录了一样。
全局设置env
sudo sh -c "echo MY_GLOBAL_ENV_TO_MY_CURRENT_DIR=$(pwd)" >> /etc/environment"
添加计划作业以启动脚本
crontab -e
*/5 * * * * sh -c "$MY_GLOBAL_ENV_TO_MY_CURRENT_DIR/start.sh"
=)
对我来说,我必须在NodeJS文件中指定路径。
// did not work!!!!!
require('dotenv').config()
而不是
// DID WORK!!
require('dotenv').config({ path: '/full/custom/path/to/your/.env' })
在/etc/environment中设置变量在Ubuntu中也适用。从12.04开始,/etc/environment中的变量将为cron加载。
我在查看与标题匹配的类似问题时发现了这个问题,但我被systemd或docker使用的环境文件语法困住了:
FOO=bar
BAZ=qux
这并不适用于Vishal的优秀答案,因为它们不是bash脚本(注意缺少导出)。 我使用的解决方案是将每一行读入xargs并在运行命令之前导出它们:
0 5 * * * export $(xargs < $HOME/.env); /path/to/command/to/run