我的网络中有两台服务器,我将一些数据从一台服务器传输到另一台服务器。我编写了一个脚本来完成此操作,当我手动运行它时,它工作正常。但是,当我将其包含在 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
这同样适用于root
crontabs(即使用 提交的作业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
解决方案可以是:
始终使用脚本中可执行程序的完整绝对路径来作为 cron 作业运行;例如
/usr/sbin/mount.cifs //192.168.1.200/share /media/SVR1 -o user=username,pass=pwd | tee -a ${LOGFILE}
或者
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