Несколько лет назад я собрал следующие expect
скрипт для выполнения резервного копирования Open Directory под Tiger Server, и он также хорошо работает под Leopard Server:
#!/usr/bin/expect -f
set date [timestamp -format "%Y-%m-%d"]
set archive_path "path/to/you/backup/dir"
set archive_password "password"
set archive_name "opendirectory_backup"
spawn /usr/sbin/slapconfig -backupdb $archive_path/$archive_name-$date
expect "Enter archive password"
send "$archive_password\r"
expect eof
Это один из немногих скриптов, который до сих пор живет в crontab root, а не имеет launchd
лист. Это rwx
от root только из очевидных соображений безопасности.
Теперь проблема в том, что я обновил свой Open Directory Master до Mac OS X 10.6.4 Snow Leopard Server пару недель назад, и с тех пор он не работал ... когда запускался cron. Если я вхожу в систему как пользователь root и запускаю его вручную, он работает правильно и создает результирующий зашифрованный образ диска. При запуске cron он выполняет полные движения (включая вывод в /Library/Logs/slapconfig.log
что соответствует тому, когда он запускается вручную), но файл образа диска никогда не создается. Однако в `/var/log/system.log/ я вижу следующий вывод:
Jul 23 03:00:08 servername hdiejectd[93114]: running
Jul 23 03:00:11 servername diskimages-helper[93111]: -frameworkCallbackWithDictionary: threw exception calling home.
Jul 23 03:00:11 servername diskimages-helper[93111]: threw exception reporting results back to framework.
Jul 23 03:00:21 servername hdiejectd[93114]: quitCheck: calling exit(0)
При запуске вручную этот вывод будет следующим (нет diskimages-helper
исключения):
Jul 23 14:29:27 servername hdiejectd[7776]: running
Jul 23 14:29:40 servername hdiejectd[7776]: quitCheck: calling exit(0)
В обоих случаях пользователь не вошел в систему через графический интерфейс. У меня есть пара друзей, которые запускают один и тот же скрипт на своих OD Masters, и он также больше не запускается через cron после обновления до Snow Leopard Server.
Я вспоминаю некоторые проблемы с инструментами создания образа диска в командной строке Mac OS X, которые требовали доступа к связке ключей, но не помню подробностей. Что-то связанное с этим стало более строгим в Snow Leopard Server?
Есть идеи или предложения?
У меня возникла та же проблема, что и при отладке исходного скрипта, для меня тайм-аут ожидания по умолчанию в 10 секунд приводил к прерыванию встроенной команды hdiutil. Я исправил это, добавив:
установить тайм-аут 120
В сценарии ожидания. Теперь скрипт снова работает нормально. Мой сценарий:
#!/usr/bin/expect -f
set date [timestamp -format "%Y-%m-%d"]
set archive_path "path/to/you/backup/dir"
set archive_password "password"
set archive_name "opendirectory_backup"
set timeout 120
spawn /usr/sbin/slapconfig -backupdb $archive_path/$archive_name-$date
expect "Enter archive password"
send "$archive_password\r"
expect eof
Хорошо, теперь у меня есть рабочее решение. Я начал с написания нового bash
скрипт (в отличие от использования expect
) который обернул вокруг Apple serveradmin
утилита (сама по себе является оболочкой вокруг slapconfig -backupdb
Я звонил прямо из в expect
сценарий):
#!/bin/bash
dst="/path/to/your/backup/directory"
pass="password"
host=$(hostname)
date=$(date +%Y-%m-%d-%H%M)
serveradmin command <<-EOC
dirserv:backupArchiveParams:archivePassword = $pass
dirserv:backupArchiveParams:archivePath = ${dst}/od_backup-${host}-${date}
dirserv:command = backupArchive
EOC
Это основано на этот сценарий, но использует bash
"здесь документ" вместо создания файла на диске, содержащего serveradmin
команды (включая пароль в виде открытого текста) для выполнения.
Он отлично работал и при запуске из командной строки, но все равно нет .sparseimage
был создан при запуске из cron. Итак, вторым этапом моего исправления было, как я упоминал выше в комментариях к моему исходному вопросу, создать launchd
plist для его запуска:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC -//Apple Computer//DTD PLIST 1.0//EN http://www.apple.com/DTDs/PropertyList-1.0.dtd >
<plist version="1.0">
<dict>
<key>Label</key>
<string>tld.domain.od_backup</string>
<key>ProgramArguments</key>
<array>
<string>/var/root/sbin/od_backup</string>
</array>
<key>StartCalendarInterval</key>
<dict>
<key>Hour</key>
<integer>2</integer>
<key>Minute</key>
<integer>30</integer>
</dict>
</dict>
</plist>
Естественно загрузил plist сsudo launchctl load /Library/LaunchDaemons/tld.domain.od_backup.plist
(домен и tld изменены для защиты личности). И, похоже, он работает правильно, когда вызывается launchd
. Исходный сценарий также мог работать правильно, если был вызван launchd
, но я не тестировал.