Почему `slapconfig -backupdb` не создает образ диска при запуске из cron на Snow Leopard Server?
Несколько лет назад я собрал следующее 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
PLIST. Это 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?
Есть идеи или предложения?
2 ответа
Хорошо, теперь у меня есть рабочее решение. Я начал с написания нового 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 w /sudo launchctl load /Library/LaunchDaemons/tld.domain.od_backup.plist
(домен & tld изменен для защиты личности). И, кажется, работает правильно, когда вызывается launchd
, Исходный сценарий мог бы также работать правильно, если вызван launchd
, но я не проверял это.
Я столкнулся с той же проблемой при отладке оригинального сценария, для меня ожидаемое время ожидания по умолчанию в 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