321

1時間ごとにcrontabを実行しています。それを実行しているユーザーには、ユーザーが端末からジョブを実行するときに機能する環境変数があり.bash_profileますが、明らかに、これらは実行時にcrontabによって取得されません。

私はそれらを設定しようとしました.profile.bashrc、まだ拾われていないようです。crontabが取得できる環境変数をどこに置くことができるか知っている人はいますか?

4

20 に答える 20

282

crontab -eコマンドラインから実行する場合は、crontab自体で環境変数を定義できます。

LANG=nb_NO.UTF-8
LC_ALL=nb_NO.UTF-8
# m h  dom mon dow   command

* * * * * sleep 5s && echo "yo"

この機能は、cronの特定の実装でのみ使用できます。UbuntuとDebianは現在vixie-cronを使用しており、これらをcrontabファイル(GNU mcron)で宣言できます。

ArchlinuxRedHatは、環境変数の宣言を許可しないcronieを使用しており、cron.logに構文エラーをスローします。回避策はエントリごとに実行できます。

# m h  dom mon dow   command
* * * * * export LC_ALL=nb_NO.UTF-8; sleep 5s && echo "yo"
于 2012-05-18T17:26:21.110 に答える
179

この問題のもう1つの解決策があります。

0 5 * * * . $HOME/.profile; /path/to/command/to/run

この場合、$HOME/.profileファイルで定義されているすべての環境変数が選択されます。

もちろん$HOME設定もされていないので、のフルパスに置き換える必要があります$HOME

于 2012-11-27T08:08:28.420 に答える
93

コマンドを実行する前に、「cron」で環境を設定するシェル スクリプトを実行します。

いつも。

#   @(#)$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

~/bin/Cron 内のスクリプトはすべて、次のような単一のスクリプト「runcron」へのリンクです。

:       "$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 ${@:+"$@"}

(古いコーディング標準を使用して記述されています。最近では、先頭にシバン '#!' を使用します。)

「~/.cronfile」は、cron で使用するための私のプロファイルのバリエーションです。厳密には非対話型であり、うるさくするためにエコーはありません。代わりに .profile などを実行するように手配できます。(REAL_HOME は私の環境の成果物です。$HOME と同じふりをすることができます。)

したがって、このコードは適切な環境を読み取り、ホーム ディレクトリから非 Cron バージョンのコマンドを実行します。たとえば、私の「weekday」コマンドは次のようになります。

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

# Update ICSCOPE
n.updics

「毎日」コマンドはより簡単です。

:       "@(#)$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
于 2010-02-09T14:43:16.993 に答える
27

@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 のソースの後のコマンドは、ログインしたかのように環境を持ちます。

于 2013-09-05T22:42:12.453 に答える
16

私にとっては、php アプリケーションの環境変数を設定する必要がありました。次のコードを crontab に追加して解決しました。

$ sudo  crontab -e

crontab:

ENVIRONMENT_VAR=production

* * * * * /home/deploy/my_app/cron/cron.doSomethingWonderful.php

doSomethingWonderful.php 内では、次のように環境値を取得できます。

<?php     
echo $_SERVER['ENVIRONMENT_VAR']; # => "production"

これが役立つことを願っています!

于 2014-09-08T11:57:04.780 に答える
16

設定したものは何でもcrontab、直接またはスクリプト内の変数を使用して、cronjobs で利用できます。

それらをcronjobの定義で使用します

crontabcronjob が使用できる変数を設定するように構成できます。

$ crontab -l
myvar="hi man"
* * * * * echo "$myvar. date is $(date)" >> /tmp/hello

ファイルには次の/tmp/helloようなものが表示されます。

$ cat /tmp/hello 
hi man. date is Thu May 12 12:10:01 CEST 2016
hi man. date is Thu May 12 12:11:01 CEST 2016

cronjob によって実行されるスクリプトでそれらを使用します

crontabスクリプトが使用できる変数を設定するように構成できます。

$ crontab -l
myvar="hi man"
* * * * * /bin/bash /tmp/myscript.sh

そして、スクリプト/tmp/myscript.shは次のようになります。

echo "Now is $(date). myvar=$myvar" >> /tmp/myoutput.res

/tmp/myoutput.res以下を示すファイルが生成されます。

$ cat /tmp/myoutput.res
Now is Thu May 12 12:07:01 CEST 2016. myvar=hi man
Now is Thu May 12 12:08:01 CEST 2016. myvar=hi man
...
于 2016-05-12T10:11:47.080 に答える
7

@Robert Brisita の展開は expand だけです。また、スクリプトでプロファイルのすべての変数を設定したくない場合は、スクリプトの上部でエクスポートする変数を選択できます。

crontab -e ファイル内:

SHELL=/bin/bash

*/1 * * * * /Path/to/script/script.sh

script.sh 内

#!/bin/bash
export JAVA_HOME=/path/to/jdk

some-other-command
于 2014-03-20T13:37:12.890 に答える
2

this this answerに触発された別の方法は、次のとおりです (fcron の例)。

%daily 00 12 \
    set -a; \
    . /path/to/file/containing/vars; \
    set +a; \
    /path/to/script/using/vars

からhelp set:

-a エクスポート用に変更または作成された変数をマークします。

- ではなく + を使用すると、これらのフラグがオフになります。

set -そのため、との間のすべてset +が にエクスポートされenv、他のスクリプトなどで使用できるようになりsetますset

それとは別に、プログラムを実行するためにルート以外のアカウントが必要であるが、他のユーザーの環境内でいくつかの変数が必要な場合に変数を渡すことも役立ちます。以下は、電子メール ヘッダーをフォーマットするために nullmailer 変数を渡す例です。

su -s /bin/bash -c "set -a; \
                    . /path/to/nullmailer-vars; \
                    set +a; \
                    /usr/sbin/logcheck" logcheck
于 2015-03-06T15:23:37.370 に答える
1

私にとっては、NodeJS ファイルでパスを指定する必要がありました。

// did not work!!!!!
require('dotenv').config()

代わりは

// DID WORK!!
require('dotenv').config({ path: '/full/custom/path/to/your/.env' })
于 2020-10-04T13:43:51.850 に答える