16.04 无法在 crontab 中挂载另一台服务器

Ric*_*ick 1 mount cron

我的网络中有两台服务器,我将一些数据从一台服务器传输到另一台服务器。我编写了一个脚本来完成此任务,当我手动运行它时它工作得很好。但是,当我将其包含在 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}
Run Code Online (Sandbox Code Playgroud)

该文件由 root:root 拥有,拥有 755 权限。(我知道我可以加强这一点,但是,我仍在尝试)。

ste*_*ver 5

cron程序在非常有限的环境中运行 - 您可以看到,例如,如果您创建一个包含

* * * * * /usr/bin/printenv > /tmp/cronenv
Run Code Online (Sandbox Code Playgroud)

然后查看生成的文件:

$ 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
Run Code Online (Sandbox Code Playgroud)

这同样适用于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
Run Code Online (Sandbox Code Playgroud)

特别是,默认PATH仅包含/bin/usr/bin; 这对于mount

$ which mount
/bin/mount
Run Code Online (Sandbox Code Playgroud)

但是,例如,这不起作用mount.cifs,因为它位于/usr/sbin

$ which mount.cifs
/sbin/mount.cifs
Run Code Online (Sandbox Code Playgroud)

解决方案是:

  1. 始终使用脚本中可执行程序的完整绝对路径作为 cron 作业运行;例如

    /usr/sbin/mount.cifs //192.168.1.200/share /media/SVR1 -o user=username,pass=pwd | tee -a ${LOGFILE}
    
    Run Code Online (Sandbox Code Playgroud)

或者

  1. PATH在此类脚本的顶部添加合适的分配,例如

    PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
    
    Run Code Online (Sandbox Code Playgroud)

注意:从系统/etc/cron.d目录运行的作业在以下位置明确设置了更广泛的路径/etc/crontab

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
Run Code Online (Sandbox Code Playgroud)