web-dev-qa-db-ja.com

crontabが使用する環境変数はどこで設定できますか?

私は1時間ごとにcrontabを実行しています。それを実行しているユーザーは、ユーザーが端末からジョブを実行するときに動作する.bash_profileに環境変数を持っています、しかし、明らかにこれらは実行時にcrontabによって拾われません。

私は.profile.bashrcにそれらを設定しようとしました、しかし、それらはまだ拾われているようには見えません。誰が私がcrontabが拾うことができる環境変数を置くことができる場所を知っていますか?

233
James

コマンドを実行する前に、環境を設定するシェルスクリプトを '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 ${@:+"$@"}

(古いコーディング標準を使って書かれています - 今日では、始めにShebang '#!'を使います。)

'〜/ .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

'daily'コマンドが簡単です。

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

コマンドラインから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 and RedHat use cronie whichは環境変数を許可しません宣言され、cron.logに構文エラーがスローされます。回避策はエントリごとに実行できます。

# m h  dom mon dow   command
* * * * * export LC_ALL=nb_NO.UTF-8; sleep 5s && echo "yo"
223
carestad

私はこの問題に対するもう一つの解決策を得ました:

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

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

もちろん$ HOMEも設定されていません、あなたはそれをあなたの$ HOMEのフルパスで置き換えなければなりません。

129
Vishal

/etc/environmentでvarsを設定することはUbuntuでも私のために働きました。 12.04以降、/etc/environment内の変数はcron用にロードされます。

41
baxeico

@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のソースの後のコマンドは、あなたがログインしたかのようにあなたの環境を持つでしょう。

21
Robert Brisita

私にとっては私はphpアプリケーション用の環境変数を設定しなければなりませんでした。私のcrontabに次のコードを追加することでそれを再検討しました。

$ Sudo  crontab -e

クロンタブ:

ENVIRONMENT_VAR=production

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

そしてdoSomethingWonderful.phpの中で私は環境値を得ることができます:

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

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

14
karlingen

あなたがcronを通して実行しているスクリプトを起動するなら:

#!/bin/bash -l

彼らはあなたの~/.bash_profile環境変数を拾うべきです

14
breizhmg

crontabに設定したものはすべて、直接使用することも、スクリプト内の変数を使用することも、cronジョブで使用できます。

Cronjobの定義にそれらを使う

変数が設定されるようにcrontabを設定すると、can 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

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
...
10
fedorqui

の代わりに

0  *  *  *  *  sh /my/script.sh

Bash -l -cを使用してください。

0  *  *  *  *  bash -l -c 'sh /my/script.sh'
5
Ilya Kharlamov

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

Crontab -eファイルでは、

Shell=/bin/bash

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

Script.sh内

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

some-other-command
4
Marcos Pousada

これに触発されたもう一つの方法 この答え - 変数を "注入"することは以下の通りです(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にのみ存在します。

それ以外にも、プログラムが実行にroot以外のアカウントを必要とするときに変数を渡すのも便利ですが、他のユーザーの環境内でいくつかの変数が必要になるでしょう。以下は、電子メールヘッダをフォーマットするためにnullmailer変数を渡す例です。

su -s /bin/bash -c "set -a; \
                    . /path/to/nullmailer-vars; \
                    set +a; \
                    /usr/sbin/logcheck" logcheck
2
Saucier

私は提供された解決策のほとんどを試しましたが、最初は何もうまくいきませんでした。しかし、うまくいかなかったのは解決策ではないことがわかりました。どうやら、私の~/.bashrcファイルは次のコードブロックで始まります。

case $- in
    *i*) ;;
    *) return;;
esac

これは基本的にcase statementで、現在のシェルの現在のオプションセットをチェックしてシェルが対話的に実行されていることを確認します。シェルが対話的に実行されている場合は、~/.bashrcファイルの取得に進みます。ただし、cronによって呼び出されたシェルでは、$-変数は対話性を示すi値を含みません。したがって、~/.bashrcファイルが完全に調達されることはありません。その結果、環境変数は設定されませんでした。これがあなたの問題であるならば、以下のようにコードのブロックをコメントアウトしてください、そして、もう一度試みてください:

# case $- in
#     *i*) ;;
#     *) return;;
# esac

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

2
Abdou

私はMacbookでOh-my-zshを使用しているため、crontabタスクを実行するために多くのことを試しましたが、最後に、実行するコマンドの前に.zshrcを追加しました。

*/30 * * * * . $HOME/.zshrc; node /path/for/my_script.js

このタスクは30分ごとに実行され、.zshrcプロファイルを使用してノードコマンドを実行します。

$HOME変数の前にドットを使用することを忘れないでください。

1
Alekosdat