16.04 では crontab で別のサーバーをマウントできません

16.04 では crontab で別のサーバーをマウントできません

私のネットワークには 2 台のサーバーがあり、一部のデータを 1 台のサーバーから別のサーバーに転送しています。これを実行するスクリプトを作成しましたが、手動で実行すると正常に動作します。ただし、プロセスを自動化するために crontab にスクリプトを含めると、スクリプトを実行しても外部サーバーがマウントされません。ログにできるだけ多くの情報を送信しましたが、マウント エラーは報告されず、接続されなかったという事実だけが報告されます。

スクリプトは次のとおりです:

#!/bin/bash
LOGFILE="/var/log/SRV1.log"
echo $(date +%Y-%m-%d_%H:%M:%S)"  --- Begins Now" | tee -a ${LOGFILE} 
StartTime="$(date +%s)"
echo "Connecting to SRV1" | tee -a ${LOGFILE}
mount.cifs //192.168.1.200/share /media/SVR1 -o user=username,pass=pwd | tee -a ${LOGFILE}

ファイルの所有者は root:root で、権限は 755 です。(権限を厳しくすることはできると思いますが、まだ実験中です)。

答え1

このcronプログラムは非常に限られた環境で実行されます。例えば、次のようなcrontabを作成すると、

* * * * * /usr/bin/printenv > /tmp/cronenv

そして結果のファイルを見てみましょう:

$ cat /tmp/cronenv
LANGUAGE=en_CA:en
HOME=/home/steeldriver
LOGNAME=steeldriver
PATH=/usr/bin:/bin
LANG=en_CA.UTF-8
SHELL=/bin/sh
PWD=/home/steeldriver

同じことがrootcrontab (つまり を使用して送信されたジョブsudo crontab -e) にも当てはまります。

LANGUAGE=en_CA:en
HOME=/root
LOGNAME=root
PATH=/usr/bin:/bin
LANG=en_CA.UTF-8
SHELL=/bin/sh
PWD=/root

特に、デフォルトには とのみがPATH含まれます。これは の場合に適しています。/bin/usr/binmount

$ which mount
/bin/mount

mount.cifsただし、これは次の場合には機能しません/usr/sbin:

$ which mount.cifs
/sbin/mount.cifs

解決策は次のいずれかです。

  1. cronジョブとして実行されるスクリプト内の実行可能プログラムには常に完全な絶対パスを使用します。例:

    /usr/sbin/mount.cifs //192.168.1.200/share /media/SVR1 -o user=username,pass=pwd | tee -a ${LOGFILE}
    

または

  1. PATHこのようなスクリプトの先頭に適切な割り当てを追加します。例:

    PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
    

注: システム/etc/cron.dディレクトリから実行されるジョブには、より広範なパスが明示的に設定されます/etc/crontab

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

関連情報