経緯
ラズパイを起動時にpyenvのpythonでpythonスクリプトを実行させたい
環境
RaspberryPi3b+
stretch(Release 9.9)
Python3.4(pyenv)
cronログを有効
sudo vi /etc/rsyslog.conf
###############
#### RULES ####
###############
#
# First some standard log files. Log by facility.
#
auth,authpriv.* /var/log/auth.log
*.*;auth,authpriv.none -/var/log/syslog
# cron.* /var/log/cron.log
daemon.* -/var/log/daemon.log
kern.* -/var/log/kern.log
lpr.* -/var/log/lpr.log
mail.* -/var/log/mail.log
user.* -/var/log/user.log
cronの行のコメントアウトを消す. すると、cronのエラー文などが取得できる
このまま、cronにスケジュールを記述しても下のエラーが出てしまう。
raspberrypi /USR/SBIN/CRON[2331]: (CRON) info (No MTA installed, discarding output)
MTA導入
sudo apt-get install postfix
これでさっきのエラーは出ない
crontabに記述
今回は起動時に実行
crontab -e
# 起動時に実行
@reboot python /home/<ユーザー名です>/Desktop/test.py >/home/<ユーザー名です>/Desktop/error.log 2>&1
/home/<ユーザー名です>/Desktop/error.logにはpythonスクリプトで吐いたエラー内容が記述される。
再起動してみると、pyenvに入っているpythonでなくラズパイにプリインストールされているpythonで実行される。
試しにcronで登録したpythonを下のように書いてみましょう。
import sys
print(sys.version)
すると
2.7.1
# 今回はpyenvに入っているpython(3.4)を使いたい
んー、つらい...
よくよく、考えるとラズパイが立ち上がってからの順番が問題では?と思う
つまり、pyenvのpathが通る前にcronが実行されているのでは??
自分はpyenvのpathを ~/.bashrcに記述しているのでこれらのスクリプトもcronに登録
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
上のスクリプトをコピー、して登録
# 起動時に実行
@reboot export PYENV_ROOT="$HOME/.pyenv"; export PATH="$PYENV_ROOT/bin:$PATH"; eval "$(pyenv init -)"; python /home/<ユーザー名です>/Desktop/test.py >/home/<ユーザー名です>/Desktop/error.log 2>&1
これで、再起動すると
3.4
# 今回はpyenvに入っているpython(3.4)を使いたい