我目前正在使用LaunchDaemons,我遇到了问题,启动显然使用了错误的用户。
这是我的LaunchDaemon的plist(文件名是org.test.user.plist):
<!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>org.test.user</string>
<key>ProgramArguments</key>
<array>
<string>/bin/bash</string>
<string>/Users/Shared/test_user.sh</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>UserName</key>
<string>_postgres</string>
<key>Umask</key>
<integer>000</integer>
<key>StandardOutPath</key>
<string>/Users/Shared/test_user.log</string>
<key>StandardErrorPath</key>
<string>/Users/Shared/test_user.log</string>
</dict>
</plist>
这个LaunchDaemon只执行脚本'test_user.sh'。这是脚本的内容:
#!/bin/bash
postbat=/Users/Shared/BatScope4/pgdc/postbat_v1_0
echo "$(date '+%Y-%m-%d %H:%M:%S'):"
echo "user: $USER"
echo "id: $(id)"
echo "umask: $(umask)"
echo "$postbat:"
ls -Al "$postbat"
exit 0
使用
从bash加载LaunchDaemon之后sudo launchctl load -F org.test.user.plist
日志文件test_user.log包含以下内容:
2015-03-13 11:19:32:
user: _postgres
id: uid=216(_batscope) gid=216(_postgres) groups=216(_postgres),12(everyone),61(localaccounts),402(com.apple.sharepoint.group.1),408(com.apple.sharepoint.group.7),409(com.apple.sharepoint.group.8),403(com.apple.sharepoint.group.2),100(_lpoperator),401(com.apple.sharepoint.group.4),405(com.apple.sharepoint.group.6),404(com.apple.sharepoint.group.3),406(com.apple.sharepoint.group.5)
umask: 0000
/Users/Shared/BatScope4/pgdc/postbat_v1_0:
ls: postbat_v1_0: Permission denied
您需要知道的是,一旦用户(和组)_postgres以UID = 216存在。但是,我删除了它并设置了一个具有以下属性的新用户_postgres:
PrimaryGroupID: 223
RecordName: _postgres
RecordType: dsRecTypeStandard:Users
UniqueID: 223
UserShell: /bin/bash
有没有人知道,为什么launchd继续使用旧用户_postgres以及我如何强迫它不要?
答案 0 :(得分:0)
经过几个小时的研究和试验后,我发现导致启动的原因是设置了错误的用户。
在文件/etc/master.passwd中,旧的_postgres用户生成了一行。我使用
摆脱了这一行sudo sed -i '' '/^_postgres.*$/d' /etc/master.passwd
现在launchd挑选了合适的用户。
因此,如果您使用
删除用户sudo dscl . delete /Users/username
不会删除passwd文件中此用户的条目。必须手动执行此操作以确保用户不会混淆。