どこで設定環境変数crontabます。
-
19-09-2019 - |
質問
い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).
Archlinux や RedHat 使用 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の前にドットを使用することを忘れないでください。