質問

いcrontabに走ります。のユーザー走行では、環境variablessの .bash_profile この場合、ユーザのジョブからターミナル、しかし、当然ながらこれらのん拾crontabの場合で運行しています。

たって設定し .profile.bashrc していなかったのでしょうかを取得し、持ち直している。なんだろうけど、日本人のできる環境varsるcrontabることができるのですか?

役に立ちましたか?

解決

「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は」クーロンで使用するための私のプロフィールのバリエーションです。代わりに、その上の.profileを実行し、ように手配できます。 (REAL_HOMEのものは、私の環境の人工物である - あなたはそれが$ HOMEと同じであるふりをすることができます。)

だから、このコードは、適切な環境を読み取り、その後、私のホームディレクトリからのコマンドの非クロンのバージョンを実行します。ですから、例えば、私の「平日」コマンドは次のようになります:

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

他のヒント

を定義することができる環境変数のcrontab自体は実行する場合 crontab -e からョンをインストールして下さい。

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.ログです。回避策ができたエントリー:

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

私はこの問題のもう一つの解決策です

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

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

コース$HOMEも設定されていないのは、

、あなたはあなたの$HOMEの完全なパスと交換する必要があります。

また、Ubuntuの中で私のために働いた/etc/environmentでVARSを設定します。 12.04の通り、/etc/environmentの変数は、cronのためにロードされます。

私は簡単に見つけた、@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のソースの後に任意のコマンドは、ご使用の環境を持つことになります。

あなたはあなたとはcronによって実行されるスクリプトを起動する場合:

#!/bin/bash -l

彼らがあなたの~/.bash_profile環境変数を拾う必要があります。

私のために私は、PHPアプリケーションのための環境変数を設定する必要がありました。私は自分のcrontabに次のコードを追加して、それをreslovedます。

$ sudo  crontab -e

のcrontabます:

ENVIRONMENT_VAR=production

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

とdoSomethingWonderful.phpの内側に私は環境値を得ることができます:

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

私はこのことができます願っています!

どのようなあなたがcrontabに設定し、両方の直接およびスクリプト内の変数を使用して、cronジョブで利用できるようになります。

cronジョブの定義でそれらを使用してください。

それは変数を設定するように

あなたはその後、インクルードを使用するcronジョブができることをcrontabを設定することができます:

$ 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

cronジョブで実行するスクリプトでそれらを使用してください。

それはその後、スクリプトが使用できる変数を設定するように

あなたは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
...

の代わりに

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

使用のbash -l -c

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

@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

別の方法 - このでこの答えを触発 - 「注入」変数に(例えば、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を渡す例は、電子メールのヘッダをフォーマットするvarsのれる

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

私は、提供ソリューションのほとんどを試してみましたが、何も最初に働きました。それが動作するように失敗した解決策ではなかったこと、しかし、判明しました。どうやら、私の~/.bashrcファイルには、次のコードブロックで始まります:

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

これは、基本的には、シェルが対話的に実行されていることを決定するために、現在のシェルのオプションの現在の設定をチェックcase statementあります。 シェルが対話的に実行されて発生した場合、それは~/.bashrcファイルをソースに移ります。 しかし、cronによって呼び出されたシェルで、$-変数は、インタラクティビティを示すi値が含まれていません。 したがって、~/.bashrcファイルが完全に供給されることは決してありません。その結果、環境変数が設定されやったことがなかったです。 これはあなたの問題であることを起こる場合は、次のようにコードのブロックをコメントアウトすること自由に感じて、もう一度試してください:

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

私は、これが判明願って便利。

私はので、私はcrontabのタスクの実行を得るために多くのことを試してみたが、最終的には、私の解決策を実行するには、コマンドの前にOh-my-zshを付加された私のMacBookに.zshrcを使用しています。

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

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top