Where can I set environment variables that crontab will use?

后端 未结 17 1912
说谎
说谎 2020-11-22 05:47

I have a crontab running every hour. The user running it has environment variabless in the .bash_profile that work when the user runs the job from the terminal,

17条回答
  •  闹比i
    闹比i (楼主)
    2020-11-22 06:24

    Have 'cron' run a shell script that sets the environment before running the command.

    Always.

    #   @(#)$Id: crontab,v 4.2 2007/09/17 02:41:00 jleffler Exp $
    #   Crontab file for Home Directory for Jonathan Leffler (JL)
    #-----------------------------------------------------------------------------
    #Min     Hour    Day     Month   Weekday Command
    #-----------------------------------------------------------------------------
    0        *       *       *       *       /usr/bin/ksh /work1/jleffler/bin/Cron/hourly
    1        1       *       *       *       /usr/bin/ksh /work1/jleffler/bin/Cron/daily
    23       1       *       *       1-5     /usr/bin/ksh /work1/jleffler/bin/Cron/weekday
    2        3       *       *       0       /usr/bin/ksh /work1/jleffler/bin/Cron/weekly
    21       3       1       *       *       /usr/bin/ksh /work1/jleffler/bin/Cron/monthly
    

    The scripts in ~/bin/Cron are all links to a single script, 'runcron', which looks like:

    :       "$Id: runcron.sh,v 2.1 2001/02/27 00:53:22 jleffler Exp $"
    #
    #       Commands to be performed by Cron (no debugging options)
    
    #       Set environment -- not done by cron (usually switches HOME)
    . $HOME/.cronfile
    
    base=`basename $0`
    cmd=${REAL_HOME:-/real/home}/bin/$base
    
    if [ ! -x $cmd ]
    then cmd=${HOME}/bin/$base
    fi
    
    exec $cmd ${@:+"$@"}
    

    (Written using an older coding standard - nowadays, I'd use a shebang '#!' at the start.)

    The '~/.cronfile' is a variation on my profile for use by cron - rigorously non-interactive and no echoing for the sake of being noisy. You could arrange to execute the .profile and so on instead. (The REAL_HOME stuff is an artefact of my environment - you can pretend it is the same as $HOME.)

    So, this code reads the appropriate environment and then executes the non-Cron version of the command from my home directory. So, for example, my 'weekday' command looks like:

    :       "@(#)$Id: weekday.sh,v 1.10 2007/09/17 02:42:03 jleffler Exp $"
    #
    #       Commands to be done each weekday
    
    # Update ICSCOPE
    n.updics
    

    The 'daily' command is simpler:

    :       "@(#)$Id: daily.sh,v 1.5 1997/06/02 22:04:21 johnl Exp $"
    #
    #       Commands to be done daily
    
    # Nothing -- most things are done on weekdays only
    
    exit 0
    

提交回复
热议问题