为什么 Linux crontab 使用 source ~/.bash_profile 不生效 ?

2019-03-06 13:21:09 +08:00
 HarryQu

问题: 我使用 crontab 做定时任务 。写了一个脚本如下 :

#!/bin/bash
cd  ~/project/python/spider/spider
nohup pipenv run python  main.py  >> log.txt 2>&1  &

因为环境变量的问题,以上脚本并不能正常执行。 因此我添加了环境变量 :

#!/bin/bash
source $HOME/.bash_proifle
echo $PATH  >> ~/hello.txt
cd  ~/project/python/spider/spider
nohup pipenv run python  main.py  >> log.txt 2>&1  &

然而我发现使用 source $HOME/.bash_proifle 后,环境变量 $PATH 仍然没有改变。 我必须手动指定 PATH=/home/apple/.local/bin:/home/apple/bin:$PATH crontab 才能正常执行,如下代码 :


#!/bin/bash
PATH=/home/apple/.local/bin:/home/apple/bin:$PATH
cd  ~/project/python/spider/spider
nohup pipenv run python  main.py  >> log.txt 2>&1  &

其中 ~/.bash_profile 内容如下 :

# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi

# User specific environment and startup programs

PATH=$PATH:$HOME/.local/bin:$HOME/bin

export PATH

5762 次点击
所在节点    Linux
18 条回复
boris1993
2019-03-06 13:32:51 +08:00
直接把 b 变量写在命令前面看看,并且不要涉及$HOME 之类的用户相关的变量

PATH=$PATH:/home/your_name/bin nohup pipenv (略)
xiaket
2019-03-06 13:48:36 +08:00
你可以做这个实验来看看 cron 是用什么环境变量跑的:

```
* * * * * export > /tmp/cron_env
```
wlsnx
2019-03-06 13:59:07 +08:00
你可以看一下.bashrc 或者它 source 的其他文件,看看有没有这种语句 [ -z "$PS1" ] && return
dangyuluo
2019-03-06 14:03:12 +08:00
看看 stderr of line `source $HOME/.bash_proifle`
shakespaces
2019-03-06 14:05:31 +08:00
crontab 有时候当前环境搞不清,一般我都直接用绝对路径
zjlletian
2019-03-06 14:05:47 +08:00
重启 /usr/sbin/crond
xiaoxinxiaobai
2019-03-06 14:06:04 +08:00
你需要知道 crontab 运行一个 task 的时候,$HOME 是啥
zthxxx
2019-03-06 14:28:05 +08:00
如果你是在云服务器上, `.bashrc` 文件里通常很可能有 `if [ "$BASH" ]` `if [ -z "$PS1" ] ` stty 之类的语句判断不是 shell 环境就退出;

并且 crontab 是根据 passwd 中启动用户的指向来设置 $HOME 变量的


> Several environment variables are set up automatically by the cron(8) daemon. SHELL is set to /bin/sh, and LOGNAME and HOME are set from the /etc/passwd line of the crontab's owner.


https://manpages.debian.org/stretch/cron/crontab.5.en.html
liubin
2019-03-06 16:54:51 +08:00
用.bashrc 吧,bash_profile 是登录 shell 用的吧。
Sherlocker
2019-03-06 17:10:33 +08:00
你可以直接配置 crontab 时直接加上 source ~/.bash_proifle && 执行脚本 ,一点问题都没
defunct9
2019-03-06 18:08:07 +08:00
开 ssh,让我上去看看
rootit
2019-03-06 18:36:41 +08:00
要用 . source 好像找不到
alexsunxl
2019-03-06 18:53:12 +08:00
crontab 尽量用绝对路径, 这个坑踩过几回
flyingpot
2019-03-06 20:12:20 +08:00
profile 打错了,是复制的吗
a15819620038
2019-03-06 20:16:14 +08:00
全路径
Beebird
2019-03-06 21:52:32 +08:00
我倒是觉得先要搞清楚哪处需要 /home/apple/bin 或 home/apple/.local/bin 作为 PATH 的搜索路径。是楼主的 pipenv 和 python ?还是 main.py 里面有例如 subprocess 之类的调用? 找到问题再对症下药。
coolloves
2019-03-07 06:54:57 +08:00
source /etc/profile
julyclyde
2019-03-07 08:55:49 +08:00
这种情况,我一般会 strace -f 一下

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/541691

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX