回答:
コマンドを実行する前に、「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
'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
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"
私はこの問題のもう一つの解決策を得ました:
0 5 * * * . $HOME/.profile; /path/to/command/to/run
この場合、$HOME/.profile
ファイルで定義されているすべての環境変数が選択されます。
もちろん$HOME
、これも設定されていません$HOME
。これをの完全なパスに置き換える必要があります。
source ~/.bashrc
ていましたが、私の.bashrc
ファイルがcronジョブとある程度競合していることがわかりました。.env_setup_rc
1行のみの非常に単純なファイルを使用すると、export MY_ENV_VAR=my_env_val
実際に機能します。私のポストを参照してください。stackoverflow.com/questions/15557777/...
varsの設定/etc/environment
もUbuntuではうまくいきました。12.04以降、の変数は/etc/environment
cron用にロードされます。
env >> /etc/environment
、現在のすべての環境変数がCRONジョブで使用できるようになりました。
env >> /etc/environment
環境変数の1つにハッシュ記号があると失敗します。アプリケーションのトラブルシューティングに最も苦労しました。そのステップで切り捨てられていた「#」を含むパスワードであることが判明しました。
cronを介して実行しているスクリプトを次のように開始すると、
#!/bin/bash -l
彼らはあなたの~/.bash_profile
環境変数を拾うべきです
root
のcrontabを実行するときにこれを使用できますか?/home/root
私のシステムにはフォルダーがないため、これがroot
のcrontab でどのように機能するのかわかりません。アイデア?
@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
...
の代わりに
0 * * * * sh /my/script.sh
bash -l -cを使用します
0 * * * * bash -l -c 'sh /my/script.sh'
この回答に触発されて変数を「注入」する別の方法は、次のとおりです(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
これが役に立つことを願っています