脚本来复制文件,而不是在mac上login

我们需要在我们的某个mac上进行一种粗略的备份 – 无论是否有人login,我们都需要每天一次将文件复制到我们的Windows文件服务器上。 我可以find脚本,当用户login时,Windows共享挂载,但我不知道如何做,当他们没有login。

有没有知道如何做到这一点的unix / osx怪胎?

没有人login时运行脚本

要运行一个守护进程,不pipe你是否有用户login,你都需要看看launchd来pipe理实际上正在执行备份的脚本。 由于Mac OS X 10.4 cron已经被一个名为launchd ( man page )的程序所替代,该程序将cron,init.d,rc和其他一些实用程序整合到一个程序中。

作为参考,launchd运行启动代理(在用户login时以用户身份运行)和启动守护程序(无论用户何时login都运行)。 这些任务由xml .plist文件定义,可以在以下位置之一find:

/System/Library/LaunchDaemons (系统任务 – 不要修改),
/Library/LaunchAgents (任何用户login时运行的计算机广泛的任务),
/Library/LaunchDaemons (无论谁login运行的计算机广泛的任务),
~/Library/LaunchAgents (用户login时运行的用户特定任务)。

有关加载,卸载等的更多信息都可以在手册页上find。

我find的最简单的方法是创build一个shell脚本来运行备份。

然后,您可以加载它,并通过将以下.plist文件放在/Library/LaunchDaemons运行,然后运行sudo launchctl load -w /Library/LaunchDaemons/org.example.script.plist加载它以运行。

 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>Label</key> <string>org.example.script</string> <key>OnDemand</key> <true/> <key>ProgramArguments</key> <array> <string>/PATH/TO/BACKUP/script.sh</string> </array> <key>RunAtLoad</key> <false/> <!-- This runs the script every day at 2AM --> <key>StartCalendarInterval</key> <dict> <key>Hour</key> <integer>2</integer> <key>Minute</key> <integer>0</integer> </dict> </dict> </plist> 

另外,如果你想编辑或创buildlaunchd plists,我build议查找Lingon的GUI来编辑和创build这样的.plist文件。

备份脚本

一个非常简单的备份脚本可能涉及以下元素:

1)挂载windows文件共享:

例如。

 mkdir /tmp/MountLocation mount -t smbfs //domain;user:password@server/sharepath /tmp/MountLocation 

2)使用rsync来备份文件。

3)完成时卸载Windows文件共享:

例如。

 if [`umount /tmp/MountLocation`] then rmdir /tmp/MountLocation fi 

有关mount -t smbfs更多信息可以在它的man page或man mount上find 。

次要警告

另一方面,应该注意的是,在Tiger(10.4)中,在处理已经在Leopard(10.5)及更高版本中修复的睡眠时,StartCalendarInterval有一个相当恼人的错误。

我强烈build议检查'cron'命令。 它允许你在不同的时间重复执行任意的命令行任务。

除了cron之外,如果您只想保留所有文件的当前副本,rsync也可能会有所帮助。 下面是Ubuntu论坛的一个howto ,它描述的过程和你在OS X中做的很类似。你可以跳到rsync的部分,用fink或者macports代替aptitude命令来获得软件包。

这些指示我看起来有点牵扯,但一旦你走了,它不应该太难。

您需要创build一个用于创build挂载点的脚本,在该挂载点上使用mount_smbfs挂载Windows服务器,复制文件,然后卸载服务器。 如果有用户login,你将不得不决定你想要的行为 – 你可能不希望他们试图挂载两次相同的共享。 以下是我用于执行类似任务的脚本中的一些内容(顺便说一句,好的格式化将每个bash注释转换为一个头,O Server Fault团队):`

  • 首先,创build一个挂载点

如果[-e / private / tmp / Volumes]; 那么mkdir / private / tmp / Volumes / Terminal / else mkdir / private / tmp / Volumes / mkdir / private / tmp / Volumes / Terminal / fi

  • 现在,把Sophos电脑安装在那里

mount_smbfs //用户名:密码@ 192.168.1.1/InterChk / private / tmp /卷/terminal

  • 如果坐骑不成功,保释!

如果[! -e / private / tmp / Volumes / Terminal / ESXP]; 然后退出fi

  • 在备份最新的文件之前删除旧的Sophos文件夹

如果[-e /Library/WebServer/Documents/Sophos.old]; 然后rm -r /Library/WebServer/Documents/Sophos.old fi

如果[-e / Library / WebServer / Documents / Sophos]; 那么mv / Library / WebServer / Documents / Sophos /Library/WebServer/Documents/Sophos.old fi

  • 创build一个新的

mkdir / Library / WebServer / Documents / Sophos

  • 并复制最新的CID

cp -Rp / private / tmp / Volumes / Terminal / ESX / Library / WebServer / Documents / Sophos / ESXP cp -Rp / private / tmp / Volumes / Terminal / ES9x / Library / WebServer / Documents / Sophos / ES9x cp -Rp / private / tmp / Volumes / Terminal / ESOSX / Library / WebServer / Documents / Sophos / ESOSX cp -Rp / private / tmp / Volumes / Terminal / savlinux / Library / WebServer / Documents / Sophos / savlinux

  • 设置Web访问的权限

chown -R _www / Library / WebServer / Documents / Sophos

  • 并卸载音量

umount / private / tmp /卷/terminal/

  • 并删除挂载点

rmdir / private / tmp / Volumes / Terminal /`

希望能帮助你开始。 然后使用cron或launchd按照重复计划设置,或者如果您愿意,可以将其设置为注销脚本,以便用户注销时自动备份文件。