我们需要对其中一台 Mac 进行粗略的备份 - 无论是否有人登录,我们都需要每天将文件从其中复制到 Windows 文件服务器一次。我可以找到在用户登录且 Windows 共享已安装时执行此操作的脚本,但我无法找到在用户未登录时执行此操作的方法。
有没有 unix / osx 极客知道如何做到这一点?
答案1
在无人登录时运行脚本
要运行一个无论用户是否登录都会运行的守护进程,您需要查看 launchd 来管理实际执行备份的脚本。自 Mac OS X 10.4 以来,cron 已被一个名为的程序取代启动(手册页) 将 cron、init.d、rc 和其他几个实用程序整合到一个程序中。
作为参考,launchd 运行启动代理(当用户登录时以用户身份运行)和启动守护程序(无论用户何时登录都运行)。这些任务由 xml .plist 文件定义,该文件可在以下位置之一找到:
/System/Library/LaunchDaemons
(系统任务 - 不修改)、
/Library/LaunchAgents
(任何用户登录时运行的计算机范围任务)、
/Library/LaunchDaemons
(无论谁登录都运行的计算机范围任务)、
~/Library/LaunchAgents
(用户登录时运行的用户特定任务)。
关于加载、卸载等的更多信息都可以在手册页中找到。
我发现的最简单的方法是创建一个 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>
此外,如果你想编辑或创建 launchd plists,我建议你查看林贡用于编辑和创建此类 .plist 文件的 GUI。
备份脚本
一个非常简单的备份脚本可能涉及以下元素:
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
请参见手册页或者人坐骑。
小警告
另一方面,需要注意的是,在 Tiger (10.4) 中,StartCalendarInterval 在处理睡眠时有一个相当烦人的错误,该错误已在 Leopard (10.5) 及更高版本中修复。
答案2
我强烈建议您查看“cron”命令。它允许您在不同时间重复安排任意命令行任务。
答案3
除了 cron,如果你只想保留所有文件的最新副本,rsync 也可能有用。以下是如何来自 Ubuntu 论坛,该论坛描述的过程与您在 OS X 中执行的过程非常相似。您可以跳到 rsync 部分,并且可以使用 fink 或 macports 替代 aptitude 命令来获取软件包。
这些说明看起来有点复杂,但是一旦你开始做,它就不会太难。
答案4
您需要编写一个脚本,该脚本创建挂载点,在该挂载点使用 mount_smbfs 挂载 Windows 服务器,复制文件,然后卸载服务器。您必须决定如果有用户登录,您想要什么行为——您可能不希望他们尝试两次挂载同一个共享。以下是我用于类似任务的脚本的一些片段(顺便说一句,很好的格式将每个 bash 注释变成标题,O Server Fault 团队):`
- 首先,创建挂载点
如果 [ -e /private/tmp/Volumes ] ; 则 mkdir /private/tmp/Volumes/Terminal/ 否则 mkdir /private/tmp/Volumes/ mkdir /private/tmp/Volumes/Terminal/ fi
- 现在,在那里安装 Sophos 计算机
mount_smbfs //用户名:[电子邮件保护]/InterChk /private/tmp/Volumes/终端
- 如果挂载不成功,则放弃!
如果 [ !-e /private/tmp/Volumes/Terminal/ESXP ] ; 然后退出 fi
- 备份当前 Sophos 文件夹之前,请先删除旧的 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
- 创建新的
mkdir /图书馆/ Web服务器/文档/ Sophos
- 并复制最新的 CID
cp -Rp /private/tmp/Volumes/终端/ESXP /库/Web服务器/文档/Sophos/ESXP cp -Rp /private/tmp/Volumes/终端/ES9x /库/Web服务器/文档/Sophos/ES9x cp -Rp /private/tmp/Volumes/终端/ESOSX /库/Web服务器/文档/Sophos/ESOSX cp -Rp /private/tmp/Volumes/终端/savlinux /库/Web服务器/文档/Sophos/savlinux
- 设置 Web 访问权限
chown -R _www /图书馆/ Web服务器/文档/ Sophos
- 并卸载卷
卸载/private/tmp/Volumes/终端/
- 并删除挂载点
rmdir /private/tmp/Volumes/Terminal/`
希望这能帮助您入门。然后使用 cron 或 launchd 来设置重复计划,或者如果您愿意,您可以将其设置为注销脚本,这样当用户注销时它会自动备份文件。