1時間ごとにcrontabを実行しています。それを実行しているユーザーには、ユーザーが端末からジョブを実行するときに機能する環境変数があり.bash_profile
ますが、明らかに、これらは実行時にcrontabによって取得されません。
私はそれらを設定しようとしました.profile
が.bashrc
、まだ拾われていないようです。crontabが取得できる環境変数をどこに置くことができるか知っている人はいますか?
1時間ごとにcrontabを実行しています。それを実行しているユーザーには、ユーザーが端末からジョブを実行するときに機能する環境変数があり.bash_profile
ますが、明らかに、これらは実行時にcrontabによって取得されません。
私はそれらを設定しようとしました.profile
が.bashrc
、まだ拾われていないようです。crontabが取得できる環境変数をどこに置くことができるか知っている人はいますか?
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)で宣言できます。
ArchlinuxとRedHatは、環境変数の宣言を許可しないcronieを使用しており、cron.logに構文エラーをスローします。回避策はエントリごとに実行できます。
# m h dom mon dow command
* * * * * export LC_ALL=nb_NO.UTF-8; sleep 5s && echo "yo"
この問題のもう1つの解決策があります。
0 5 * * * . $HOME/.profile; /path/to/command/to/run
この場合、$HOME/.profile
ファイルで定義されているすべての環境変数が選択されます。
もちろん$HOME
設定もされていないので、のフルパスに置き換える必要があります$HOME
。
コマンドを実行する前に、「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
@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 のソースの後のコマンドは、ログインしたかのように環境を持ちます。
私にとっては、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"
これが役立つことを願っています!
設定したものは何でもcrontab
、直接またはスクリプト内の変数を使用して、cronjobs で利用できます。
crontab
cronjob が使用できる変数を設定するように構成できます。
$ 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
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
...
@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
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
私にとっては、NodeJS ファイルでパスを指定する必要がありました。
// did not work!!!!!
require('dotenv').config()
代わりは
// DID WORK!!
require('dotenv').config({ path: '/full/custom/path/to/your/.env' })