为什么 Linux crontab 使用 source ~/.bash_profile 不生效 ? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
HarryQu
V2EX    Linux

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

  •  
  •   HarryQu 2019-03-06 13:21:09 +08:00 6319 次点击
    这是一个创建于 2431 天前的主题,其中的信息可能已经有所发展或是发生改变。

    问题: 我使用 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 
    18 条回复    2019-03-07 08:55:49 +08:00
    boris1993
        1
    boris1993  
       2019-03-06 13:32:51 +08:00 via Android
    直接把 b 变量写在命令前面看看,并且不要涉及$HOME 之类的用户相关的变量

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

    ```
    * * * * * export > /tmp/cron_env
    ```
    wlsnx
        3
    wlsnx  
       2019-03-06 13:59:07 +08:00
    你可以看一下.bashrc 或者它 source 的其他文件,看看有没有这种语句 [ -z "$PS1" ] && return
    dangyuluo
        4
    dangyuluo  
       2019-03-06 14:03:12 +08:00
    看看 stderr of line `source $HOME/.bash_proifle`
    shakespaces
        5
    shakespaces  
       2019-03-06 14:05:31 +08:00 via Android
    crontab 有时候当前环境搞不清,一般我都直接用绝对路径
    zjlletian
      &nbs; 6
    zjlletian  
       2019-03-06 14:05:47 +08:00
    重启 /usr/sbin/crond
    xiaoxinxiaobai
        7
    xiaoxinxiaobai  
       2019-03-06 14:06:04 +08:00 via Android
    你需要知道 crontab 运行一个 task 的时候,$HOME 是啥
    zthxxx
        8
    zthxxx  
       2019-03-06 14:28:05 +08:00   1
    如果你是在云服务器上, `.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
        9
    liubin  
       2019-03-06 16:54:51 +08:00
    用.bashrc 吧,bash_profile 是登录 shell 用的吧。
    Sherlocker
        10
    Sherlocker  
       2019-03-06 17:10:33 +08:00
    你可以直接配置 crontab 时直接加上 source ~/.bash_proifle && 执行脚本 ,一点问题都没
    defunct9
        11
    defunct9  
       2019-03-06 18:08:07 +08:00
    开 ssh,让我上去看看
    rootit
        12
    rootit  
       2019-03-06 18:36:41 +08:00
    要用 . source 好像找不到
    alexsunxl
        13
    alexsunxl  
       2019-03-06 18:53:12 +08:00
    crontab 尽量用绝对路径, 这个坑踩过几回
    flyingpot
        14
    flyingpot  
       2019-03-06 20:12:20 +08:00
    profile 打错了,是复制的吗
    a15819620038
        15
    a15819620038  
       2019-03-06 20:16:14 +08:00 via iPhone
    全路径
    Beebird
        16
    Beebird  
       2019-03-06 21:52:32 +08:00
    我倒是觉得先要搞清楚哪处需要 /home/apple/bin 或 home/apple/.local/bin 作为 PATH 的搜索路径。是楼主的 pipenv 和 python ?还是 main.py 里面有例如 subprocess 之类的调用? 找到问题再对症下药。
    sparkssssssss
        17
    sparkssssssss  
       2019-03-07 06:54:57 +08:00 via iPhone
    source /etc/profile
    julyclyde
        18
    julyclyde  
       2019-03-07 08:55:49 +08:00
    这种情况,我一般会 strace -f 一下
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     901 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 19:51 PVG 03:51 LAX 12:51 JFK 15:51
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86