16.04 無法在 crontab 中掛載另一台伺服器

16.04 無法在 crontab 中掛載另一台伺服器

我的網路中有兩台伺服器,我將一些資料從一台伺服器傳輸到另一台伺服器。我編寫了一個腳本來完成此任務,當我手動運行它時它工作得很好。但是,當我將其包含在 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程式在非常有限的環境中運行 - 您可以看到,例如,如果您建立一個包含

* * * * * /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/bin;這對於mount

$ 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

相關內容