普段の zsh では問題なく動くのに、cron だとコマンドが見つからない。
ssh が動くのに、見つからないってことはパスが通ってないと考えた。
でも、どこのパス?っていう疑問で考えたのが /bin/sh のパス。
シェルスクリプトの頭に
#!/bin/sh
を書いていたから、sh でパスが通ってないのかとおもったけど、どうもそうではなかった。
sh-3.2$ which ssh
/usr/local/bin/ssh
sh-3.2$ echo $PATH
/usr/kerberos/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/local/java/jdk/bin:/usr/local/java/ant/bin:/usr/local/java/javacc/bin:/usr/local/java/jflex/bin
/usr/local/bin/ssh
sh-3.2$ echo $PATH
/usr/kerberos/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/local/java/jdk/bin:/usr/local/java/ant/bin:/usr/local/java/javacc/bin:/usr/local/java/jflex/bin
そうなると、シェルスクリプトの呼び出し元が怪しいので、crontab を調べることに。
パスが設定できることを思い出し、crontab がデフォルトで設定するパスを調べる。
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly
うん、見事にパスが通ってない。
原因がわかったので、自分の crontab にパスを通す。
sh-3.2$ crontab -e
PATH=/sbin:/bin:/usr/sbin:/usr/bin
↓
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin
これでようやっと cron で ssh コマンドを実行することができた。
0 件のコメント:
コメントを投稿