cron : シェル起動:コマンドからは成功するのに、cron 実行では失敗する

はじめに

自分向けメモです。

状況

  • サーバOS:CentOS 6.X
  • したいこと
    • 「df -hコマンドを実行 → 結果をメール送信する」シェルスクリプトを作成
    • 上のシェルを毎日2時に実行するようにcronを設定
  • 結果
    • sendmailコマンドが見つからず、mail.txtが出来ただけ

◆crontab の記述
0 2 * * * /var/sh/sendMail/sendMail.sh 2>&1 | logger -i -t sendMail

◆実行したいシェル

#######################################################
# ディスク使用量(df -hの結果)を指定メアドに送信します。
#######################################################

MAIL=mail.txt
DESTINATION=hogehoge@mail.com
cd /var/sh/sendMail

# ヘッダの編集
echo 'From: ' > ${MAIL}
echo  "To: <${DESTINATION}>">> ${MAIL}
echo 'Subject: 【バックアップサーバ】ディスク使用状況' >> ${MAIL}
echo '' >> ${MAIL}

# ボディの編集
echo '◇対象サーバ : piyoちゃん' >>${MAIL}
echo '' >> ${MAIL}
echo '◇df 結果' >> ${MAIL}
df -h >> ${MAIL}
echo '' >> ${MAIL}

# メールを送信
cat ${MAIL} | sendmail -i -t

原因&対応

原因(推測)

cronを実行してるのはrootユーザなので、rootユーザが対象のシェルを実行した時と同じ結果になると思っていましたが、違うんですね。 次のことを先輩に教えてもらいました。

  • SSH接続時にパスやエイリアスの設定を行っている
  • cron 実行ユーザはrootでも、上記のエイリアスなどの設定をおこなってないのでは?


「エラー内容はコマンドが見つからない」なので、パスが通っていないとしたら納得いきます。

対応

パスが通ってなさそうと分かればあとは、簡単です。

  1. [which sendmail]を実行して、コマンドのフルパス取得
  2. シェル内のコマンドをフルパスに修正
    cat ${MAIL} | sendmail -i -t

    cat ${MAIL} | /usr/sbin/sendmail -i -t

以上で、cronからもシェルが正しく動くようになりました。

おまけ

SSH接続時にパスやエイリアスの設定を行っている

これを実行しているのが、/root/.bash_profile, /root/.bashrc らしいです。 対象のシェル内に記述をコピペっても動きました。


##################
# /root/.bash_profile, /root/.bashrc  から移植
# (cron起動時でも、SSH接続と同じように各種コマンドを実行できるようパス等を設定)

PATH=$PATH:$HOME/bin

alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
alias g=git

# Source global definitions
if [ -f /etc/bashrc ]; then
  . /etc/bashrc
fi

export NVM_DIR="/root/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"  # This loads nvm

##################

# 以降、本来したいこと

力技感がひどいので、もっとスマートにできるようになりたいものです。

0 件のコメント :

コメントを投稿