LaunchD Plist не работает
РЕДАКТИРОВАТЬ: Кажется, как будто я получаю ошибку в консоли com.apple.launchd: (com.xxxx.adbind[57]) Выход с кодом: 1
Что это хотя бы значит?
Также; если я загружу файл launchd plist, вошедший в систему с помощью команды launchctl, он работает нормально!
Я схожу с ума, пытаясь понять, почему мой launchd не работает. Я использую это в Mountain Lion 10.8.2 Когда я запускаю его вручную с помощью launchctl, он говорит, что он загружен, но скрипт не работает. Скрипт при запуске вручную работает также хорошо. Возможно, просто нужно лучше взглянуть на то, что я делаю.
Сначала я объясню, чего я пытаюсь достичь. У меня около 400 компьютеров вне сайта. Мне нужно, чтобы эти компьютеры были связаны с AD, чего нельзя сделать вне нашей сети. Я подумал, что при запуске запускается скрипт launchd, чтобы вызвать скрипт, а затем проверить скрипт, чтобы убедиться, что он находится в сети, прежде чем он запустится. Я могу связать эти компьютеры при первом запуске в нашей сети, прежде чем пользователь AD войдет в систему.
Вот мой launchd, я помещаю его в /Library/launchDaemons
<?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>com.xxxx.adbind</string>
<key>ProgramArguments</key>
<array>
<string>/usr/local/bin/adbind.bash</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>WorkingDirectory</key>
<string>/usr/local/bin</string>
</dict>
</plist>
Я пытался использовать это с и без ключа WorkingDirectory.
Вот мой скрипт, я помещаю свой скрипт в /usr/local/bin
#!/bin/bash
computerid=`/usr/sbin/scutil --get LocalHostName`
# Standard parameters
domain="xxx.xxxx.edu" # fully qualified DNS name of Active Directory Domain
udn="xxxxxx" # username of a privileged network user
password="xxxxx" # password of a privileged network user
ou="OU=xxx,DC=xxx,DC=xxxx,DC=edu" # Distinguished name of container for the computer
# Advanced options
alldomains="enable" # 'enable' or 'disable' automatic multi-domain authentication
localhome="enable" # 'enable' or 'disable' force home directory to local drive
protocol="smb" # 'afp' or 'smb' change how home is mounted from server
mobile="enable" # 'enable' or 'disable' mobile account support for offline logon
mobileconfirm="disable" # 'enable' or 'disable' warn the user that a mobile acct will be created
useuncpath="enable" # 'enable' or 'disable' use AD SMBHome attribute to determine the home dir
user_shell="/bin/bash" # e.g., /bin/bash or "none"
preferred="-preferred xxx.xxxxx.edu" # Use the specified server for all Directory lookups and authentication
# (e.g. "-nopreferred" or "-preferred ad.server.edu")
admingroups="xxx\admins,xxx\teachers,xxx\ADManagement - Computers,xxx\employees" # These comma-separated AD groups may administer the machine (e.g. "" or "APPLE\mac admins")
# Login hook setting -- specify the path to a login hook that you want to run instead of this script
### End of configuration
## Wait until all network services are up.
ipconfig waitall
# Check to see if we're in the district
if ping -c 1 xxx.xxx.x.x
then
# Activate the AD plugin
defaults write /Library/Preferences/DirectoryService/DirectoryService "Active Directory" "Active"
plutil -convert xml1 /Library/Preferences/DirectoryService/DirectoryService.plist
sleep 5
# Remove computer from OU
dsconfigad -f -r -u xxxxxxx -p xxxxxx
sleep 5
# Bind to AD
dsconfigad -f -a $computerid -domain $domain -u $udn -p "$password" -ou "$ou"
# Configure advanced AD plugin options
if [ "$admingroups" = "" ]; then
dsconfigad -nogroups
else
dsconfigad -groups "$admingroups"
fi
dsconfigad -alldomains $alldomains -localhome $localhome -protocol $protocol \
-mobile $mobile -mobileconfirm $mobileconfirm -useuncpath $useuncpath \
-shell $user_shell $preferred
# Restart DirectoryService (necessary to reload AD plugin activation settings)
killall DirectoryService
# Add the AD node to the search path
if [ "$alldomains" = "enable" ]; then
csp="/Active Directory/All Domains"
else
csp="/Active Directory/$domain"
fi
# This works in a pinch if the above code does not
defaults write /Library/Preferences/DirectoryService/SearchNodeConfig "Search Node Custom Path Array" -array "/Active Directory/All Domains"
defaults write /Library/Preferences/DirectoryService/SearchNodeConfig "Search Policy" -int 4
defaults write /Library/Preferences/DirectoryService/ContactsNodeConfig "Search Node Custom Path Array" -array "/Active Directory/All Domains"
defaults write /Library/Preferences/DirectoryService/ContactsNodeConfig "Search Policy" -int 4
plutil -convert xml1 /Library/Preferences/DirectoryService/SearchNodeConfig.plist
## Remove the script and launchd job. Be sure to delete the script.
launchctl unload -w /Library/LaunchDaemons/com.xxxx.adbind.plist
rm /Library/LaunchDaemons/com.xxxx.adbind.plist
rm /usr/local/bin/adbind.bash
exit 0
else
echo "District not Available. Quitting"
exit 1
fi
Спасибо за любую помощь!
2 ответа
Ну, я наконец-то проработал свою проблему и нашел решение! Я собираюсь опубликовать ответ здесь, чтобы, надеюсь, когда-нибудь помочь кому-то еще! Кажется, что запускаемый файл не работал достаточно долго, чтобы запустить весь мой скрипт. Поэтому я добавил ключ KeepAlive в список. Теперь это выглядит так.
<?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>com.xxxx.adbind</string>
<key>KeepAlive</key>
<dict>
<key>SuccessfulExit</key>
<false/>
</dict>
<key>ProgramArguments</key>
<array>
<string>/usr/local/bin/adbind.bash</string>
</array>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>
У меня также были проблемы с разрешениями, и я обнаружил, что папка "bin", которую я создал и поместил в скрипт, не принадлежала пользователю root. Поэтому я запустил команды chown и chmod для своих файлов и папок. Как это.
sudo chown root:wheel bin
sudo chown root:wheel adbind.bash
sudo chmod 755 adbind.bash
sudo chown root:wheel com.xxxx.adbind.plist
sudo chmod 755 com.xxxx.adbind.plist
Код выхода 1 означает, что скрипт завершился с ошибкой. Если он завершится с 0, это будет означать, что ошибок не было.