私は1時間ごとにcrontabを実行しています。それを実行しているユーザーは、ユーザーが端末からジョブを実行するときに動作する.bash_profile
に環境変数を持っています、しかし、明らかにこれらは実行時にcrontabによって拾われません。
私は.profile
と.bashrc
にそれらを設定しようとしました、しかし、それらはまだ拾われているようには見えません。誰が私が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 ${@:+"$@"}
(古いコーディング標準を使って書かれています - 今日では、始めに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
コマンドラインから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"
私はこの問題に対するもう一つの解決策を得ました:
0 5 * * * . $HOME/.profile; /path/to/command/to/run
この場合、$ HOME/.profileファイルに定義されているすべての環境変数が選択されます。
もちろん$ HOMEも設定されていません、あなたはそれをあなたの$ HOMEのフルパスで置き換えなければなりません。
/etc/environment
でvarsを設定することはUbuntuでも私のために働きました。 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のソースの後のコマンドは、あなたがログインしたかのようにあなたの環境を持つでしょう。
私にとっては私はphpアプリケーション用の環境変数を設定しなければなりませんでした。私のcrontabに次のコードを追加することでそれを再検討しました。
$ Sudo crontab -e
クロンタブ:
ENVIRONMENT_VAR=production
* * * * * /home/deploy/my_app/cron/cron.doSomethingWonderful.php
そしてdoSomethingWonderful.phpの中で私は環境値を得ることができます:
<?php
echo $_SERVER['ENVIRONMENT_VAR']; # => "production"
これが役に立つことを願っています!
あなたがcronを通して実行しているスクリプトを起動するなら:
#!/bin/bash -l
彼らはあなたの~/.bash_profile
環境変数を拾うべきです
crontab
に設定したものはすべて、直接使用することも、スクリプト内の変数を使用することも、cronジョブで使用できます。
変数が設定されるように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
スクリプトが使用できる変数を設定するように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変数を渡す例です。
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
これが役に立つことを願っています
私はMacbookでOh-my-zsh
を使用しているため、crontabタスクを実行するために多くのことを試しましたが、最後に、実行するコマンドの前に.zshrc
を追加しました。
*/30 * * * * . $HOME/.zshrc; node /path/for/my_script.js
このタスクは30分ごとに実行され、.zshrc
プロファイルを使用してノードコマンドを実行します。
$HOME
変数の前にドットを使用することを忘れないでください。