使Mac OSX launchctl在启动时以root身份启动进程

时间:2013-06-12 22:33:11

标签: macos daemon launchd

我的问题是如何在重启后使用具有root权限的launchd start创建MacOSX守护进程?

我正在编写一个内部使用的应用程序来阻止访问网站。它是用python编写的,并修改/ ect / hosts文件以禁用或启用列出的URL。主要的应用程序是在django中,我创建了一个python twisted守护进程,它实现了/ etc / hosts文件的实际修改,因为root访问权限是必需的。

我创建了一个plist文件,它可以处理一个小问题。重新启动后,守护进程具有正常的登录权限,而不是root权限。

解决方法是使用我的普通权限停止进程,然后使用sudo启动进程。

launchctl unload /Library/LaunchAgents/com.balanceinfosystems.socialshields.twisted.plist 
sudo launchctl load /Library/LaunchAgents/com.balanceinfosystems.socialshields.twisted.plist 

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>com.balanceinfosystems.socialshields.twisted</string>
    <key>Program</key>
    <string>/source/social_shields/social_shields_twisted.py</string>
    <key>KeepAlive</key>
    <true/>
  </dict>
</plist>

1 个答案:

答案 0 :(得分:19)

你把它放在错误的目录中。 LaunchAgent是按用户运行的进程。系统流程进入/Library/LaunchDaemons。它们以root身份运行。如果您希望在启动时运行它,我建议使用以下命令将其显式化:

<key>RunAtLoad</key>
<true/>