Ubuntu 18.04 でのスタートアップスクリプト指定の良い方法のポストで記述したが、前回は、Ubuntuのスタートアップスクリプトをcrontabで作成する方法を記述した。
しかし、あの方法では一つ欠点がある。環境変数がうまく反映されないのだ。
環境変数を設定しない場合
前回の方法で例えばこんなスクリプトを書いてみる。本来はスタートアップスクリプトとして書くのだが、今回はテストのために、テストスクリプトを書いてみた。クーロンを設定するシェルと、単純に環境変数を出力するシェルだ。
set_cron.sh
#!/bin/bashPATH=/home/azureuser/csv:$PATHSHELL_DIR=/home/ushio/Codes/DevSecOps/volley/playground/cron
SHELL_FILE=${SHELL_DIR}/foo.sh
(echo"*/1 * * * * ${SHELL_FILE}> ${SHELL_DIR}/abc.log") | crontab -u ushio -
foo.sh
#!/bin/bashecho"Print PATH environment variables."echo$PATHこれを普通に実行すると次のようになる。ちなみに、設定の反映は、クーロンが起動していないといけないため、と設定反映のため、リスタートしておく。
$ ./set_cron.sh
$ sudo /etc/init.d/cron restart
実行結果
凄くPATHが少ない。crontabで設定した結果を見ても、PATHは含まれていない。
$ cat abc.log
Print PATH environment variables.
/usr/bin:/bin
/var/spool/cron/crontabs/ushio
$ sudo cat /var/spool/cron/crontabs/ushio
# DO NOT EDIT THIS FILE - edit the master and reinstall.# (- installed on Wed Dec 25 22:32:15 2019)# (Cron version -- $Id: crontab.c,v 2.13 1994/01/17 03:20:37 vixie Exp $)*/1 **** /home/ushio/Codes/DevSecOps/volley/playground/cron/foo.sh > /home/ushio/Codes/DevSecOps/volley/playground/cron/abc.log
PATH を含む方法
改行コード\nは、crontabは認識してくれなさそうなので、複数行を送る方法はないみたいなので、次のような工夫をしてみました。2回crontabを実施するけど、2回目は、1回目に設定した内容を引き継ぐようにしています。-lオプションをつかって、現在の内容をとり、それと新しい設定をマージしています。
set_cron.sh
#!/bin/bashPATH=/home/azureuser/csv:$PATHSHELL_DIR=/home/ushio/Codes/DevSecOps/volley/playground/cron
SHELL_FILE=${SHELL_DIR}/foo.sh
echo"PATH=${PATH}" | crontab -u ushio -
(crontab -l 2>/dev/null;echo"*/1 * * * * ${SHELL_FILE}> ${SHELL_DIR}/abc.log") | crontab -u ushio -
実行結果
想定通りの結果がでていますね。
$ Print PATH environment variables.
/home/azureuser/csv:/home/ushio/.goenv/versions/1.13.4/bin:/home/ushio/.goenv/shims:/home/ushio/.goenv/bin:/home/ushio/.anyenv/bin:/home/ushio/.vscode-server/bin/8795a9889db74563ddd43eb0a897a2384129a619/bin:/home/ushio/.goenv/versions/1.13.4/bin:/home/ushio/.goenv/shims:/home/ushio/.goenv/bin:/home/ushio/.anyenv/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/home/ushio/dotnet:/usr/lib/jvm/java-8-openjdk-amd64/bin:/home/ushio/Codes/DevSecOps/EpiServer/StressTesting/apache-jmeter-5.2/bin:/home/ushio/go/1.13.4/bin:/home/ushio/dotnet:/usr/lib/jvm/java-8-openjdk-amd64/bin:/home/ushio/Codes/DevSecOps/EpiServer/StressTesting/apache-jmeter-5.2/bin:/home/ushio/go/1.13.4/bin
/var/spool/cron/crontabs/ushio
$ sudo cat /var/spool/cron/crontabs/ushio
# DO NOT EDIT THIS FILE - edit the master and reinstall.# (- installed on Wed Dec 25 22:32:15 2019)# (Cron version -- $Id: crontab.c,v 2.13 1994/01/17 03:20:37 vixie Exp $)PATH=/home/azureuser/csv:/home/ushio/.goenv/versions/1.13.4/bin:/home/ushio/.goenv/shims:/home/ushio/.goenv/bin:/home/ushio/.anyenv/bin:/home/ushio/.vscode-server/bin/8795a9889db74563ddd43eb0a897a2384129a619/bin:/home/ushio/.goenv/versions/1.13.4/bin:/home/ushio/.goenv/shims:/home/ushio/.goenv/bin:/home/ushio/.anyenv/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/home/ushio/dotnet:/usr/lib/jvm/java-8-openjdk-amd64/bin:/home/ushio/Codes/DevSecOps/EpiServer/StressTesting/apache-jmeter-5.2/bin:/home/ushio/go/1.13.4/bin:/home/ushio/dotnet:/usr/lib/jvm/java-8-openjdk-amd64/bin:/home/ushio/Codes/DevSecOps/EpiServer/StressTesting/apache-jmeter-5.2/bin:/home/ushio/go/1.13.4/bin
*/1 **** /home/ushio/Codes/DevSecOps/volley/playground/cron/foo.sh > /home/ushio/Codes/DevSecOps/volley/playground/cron/abc.log