読者です 読者をやめる 読者になる 読者になる

end0tknr's kipple - 新web写経開発

http://d.hatena.ne.jp/end0tknr/ から移転します

linuxのcron実行時の環境変数は、最低限のもののみ

cron実行するscriptはfull pathでcrontab -eに登録しておけば、問題はありませんでしたが、忘れていました。

まず、次のscriptは環境変数のkey-valueを一覧表示するものです。

#!/usr/local/bin/perl
use strict;
use Date::Calc qw/Today_and_Now/;

main();

sub main {
    print sprintf("#### %04d-%02d-%02d %02d:%02d:%02d",
                  Date::Calc::Today_and_Now() ),"\n";
    for my $atri_key ( sort keys %ENV){
        print "$atri_key : $ENV{$atri_key}\n";
    }
    print "\n";
}

このscriptをコマンドプロンプトから実行すると、次のように大量?のkey-valueが表示されます。

#### 2015-04-18 10:02:01
CATALINA_BASE : /home/endo/local/tomcat6
CATALINA_HOME : /home/endo/local/tomcat6
CVS_RSH : ssh
G_BROKEN_FILENAMES : 1
HISTCONTROL : ignoredups
HISTSIZE : 1000
HOME : /home/endo
HOSTNAME : cent6.a5.jp
HULEXEP : /usr/local/HULFT/bin
HULPATH : /usr/local/HULFT/etc
JAVA_HOME : /usr/local/java
JAVA_OPTS : -Xmx1024m -XX:MaxPermSize=256m
LANG : en_US.UTF-8
LESSOPEN : ||/usr/bin/lesspipe.sh %s
LOGNAME : endo
LS_COLORS : rs=0:di=01;34:ln=01;36: <略> ;36:*.xspf=01;36:
MAIL : /var/spool/mail/endo
OLDPWD : /home/endo
PATH : /usr/local/HULFT/bin:/usr/lib64/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin
PWD : /home/endo/tmp/TEST_CRON
QTDIR : /usr/lib64/qt-3.3
QTINC : /usr/lib64/qt-3.3/include
QTLIB : /usr/lib64/qt-3.3/lib
SHELL : /bin/bash
SHLVL : 1
SSH_AUTH_SOCK : /tmp/ssh-pfLfn10070/agent.10070
SSH_CLIENT : 192.168.56.1 51608 22
SSH_CONNECTION : 192.168.56.1 51608 192.168.56.101 22
SSH_TTY : /dev/pts/0
TERM : xterm
USER : endo
_ : ./foo_1.pl

次にcrontabにscriptを登録し実行すると、環境変数が最低限のもののみになっていることが分かります。

$ crontab -l                                                               
* * * * * /home/endo/tmp/TEST_CRON/foo_1.pl >> /home/endo/tmp/foo.log
#### 2015-04-18 10:05:01
HOME : /home/endo
LANG : en_US.UTF-8
LOGNAME : endo
PATH : /usr/bin:/bin
PWD : /home/endo
SHELL : /bin/sh
SHLVL : 1
USER : endo
_ : /home/endo/tmp/TEST_CRON/foo_1.pl

環境変数は同一プロセスでのみ有効ですので、

$ crontab -l                                                               
* * * * * /home/endo/.bash_profile;/home/endo/tmp/TEST_CRON/foo_1.pl >> /home/endo/tmp/foo.log

のように同一crontabのエントリで、.bash_profile を実行しても効果はありません。

$ crontab -l                                                               
HULEXEP=/usr/local/HULFT/bin
HULPATH=/usr/local/HULFT/etc
* * * * * /home/endo/tmp/TEST_CRON/foo_1.pl >> /home/endo/tmp/foo.log

のようにcrontab内での環境変数登録が、最もお手軽です。