我试图执行一个shell脚本来运行一个'rsync'进程,将服务器上的本地目录同步到安装在同一台服务器上的NFS挂载。我将脚本作为“root”运行,即'sudo进入有权写入NFS挂载的用户,并运行另一个执行'rsync'的shell脚本。rsync脚本的作品,但不是当通过cron预定时
当我以“root”身份手动运行此脚本时,脚本成功运行。但是,当我安排脚本通过'cron'运行时,'rsync'进程开始,但不完成,停止在构建文件列表的阶段。
这是剧本, “exec_NFS_rsync.sh” 我跑的 “根”:
#!/bin/bash
sudo -u nfsuser /path/to/scripts/nfs_rsync/scripts/NFS_rsync.sh
这是 “NFS_rsync.sh” 的内容:
#!/bin/bash
##
## VARIABLES
##
# rsync binary
rsync="/usr/bin/rsync"
# Source
sourcedir="/path/to/source/files/"
# Destination
destdir="/path/to/destination/nfs/mount/"
# Exclude
exclude="--exclude=*.tmp --exclude=tmp/ --exclude=*.lck"
# Log file
log_file="/path/to/log/folder/NFS_rsync.log"
##
## SCRIPT
##
# Check if the log file exists
if [ ! -e $log_file ]; then
touch $log_file
fi
if [ ! -d $destdir ]; then
echo "Log destination directory doesn't seem to exist. Please investigate"
exit 2
fi
# Start entry in the log
echo "$(date "+%Y-%m-%d %k:%M:%S") - Local Storage to NFS Sync started." >> $log_file
# Start sync NFS to Local
`$rsync -av --stats --delete $exclude $sourcedir $destdir >> $log_file`
echo "$(date "+%Y-%m-%d %k:%M:%S") - Local Storage to NFS Sync completed." >> $log_file
# End entry in the log
echo "" >> $log_file
exit
这是输出我从'cron'运行时收到:
2012-04-05 16:20:01 - Local Storage to NFS Sync started.
building file list ... 2012-04-05 16:20:01 - Local Storage to NFS Sync completed.
请注意,“建筑文件列表”永远不会被标记为“完成”。
没有文件传输发生。
这是“的crontab”条目:
*/10 * * * * /path/to/scripts/nfs_rsync/scripts/exec_NFS_rsync.sh
如果我手动运行它,我得到了全面详细的输出和成功的传输完成,随后提交统计(因为这是我将不包括它长)。
我不认为这是一个权限问题,因为我可以从shell执行“exec_NFS_rsync.sh”脚本作为“root”,也可以直接执行“NFS_rsync.sh”脚本作为“ nfsuser”。
这是'fstab文件条目NFS挂载:
nfsfiler:/path/to/nfs/mount /path/to/destination/nfs/mount/ nfs hard,intr,nfsvers=3,rw,rsize=32768,wsize=32768 0 0
预先感谢任何帮助,您可以提供。
我在使用'$。/ the_script.sh'语法的非linux文件系统中运行脚本时遇到了问题。问题是我无法将该脚本标记为FAT文件系统中的可执行文件。必须像'$ bash the_script.sh'那样运行它' – heltonbiker 2012-04-10 02:00:28
那些反向的'rsync'命令行是否会出现SO错误或者是您实际脚本中的反向错误? – sarnold 2012-04-10 02:06:28
这是一个远射,但是你运行[强制访问控制](http://en.wikipedia.org/wiki/Mandatory_access_control)系统,如[AppArmor](http://wiki.ubuntu.com)/AppArmor /),[SELinux](http://en.wikipedia.org/wiki/Security-Enhanced_Linux),[TOMOYO](http://tomoyo.sourceforge.jp/index.html.en)或[SMACK ](http://schaufler-ca.com/)?由于cron(8)'用完了,任何这些都可能导致脚本在不同的保护域中执行。对于看起来相关的日志消息,请检查'dmesg(1)'或'/ var/log/audit/audit.log'。 – sarnold 2012-04-10 02:09:05