无法在Yosemite中使用launchctl启动守护程序


27

我在其中放置了一个启动的守护进程,~/Library/LaunchAgents该守护进程在Mavericks中运行良好。但这不会在优胜美地公开测试版中开始。守护程序plist就像这样(我的用户名darksair使用UID 501)

<?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>org.darksair.retrmail</string>
    <key>ProgramArguments</key>
    <array>
      <string>/Users/darksair/bin/retrmail.py</string>
    </array>
    <key>KeepAlive</key>
    <false/>
    <key>StartInterval</key>
    <integer>300</integer>
    <key>LaunchOnlyOnce</key>
    <false/>
    <key>UserName</key>
    <string>darksair</string>
    <key>ProcessType</key>
    <string>Standard</string>
    <key>EnvironmentVariables</key>
    <dict>
      <key>PATH</key>
      <string>/Users/darksair/Python/bin:/Users/darksair/Python3/bin:/Users/darksair/bin:/usr/local/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin</string>
    </dict>
    <key>StandardOutPath</key>
    <string>/Users/darksair/logs/retrmail.log</string>
    <key>StandardErrorPath</key>
    <string>/Users/darksair/logs/retrmail.log</string>
  </dict>
</plist>

基本上应该~/bin/retrmail.py每5分钟运行一次。

我注意到在Yosemite中,launchd已升级到2.0,并且launchctl具有新命令。我试过了

sudo launchctl kickstart user/501/org.darksair.retrmail

它说

Could not find service "org.darksair.retrmail" in domain for uid: 501

我也尝试过旧学校

sudo launchctl load ~/Library/LaunchAgents/retrmail.plist

它说

/Users/darksair/Library/LaunchAgents/retrmail.plist: Path had bad ownership/permissions

该文件归我和工作人员小组所有。我尝试了权限644和600都出现相同的错误。

那么,有谁知道如何在优胜美地适当启动启动的守护程序?


更新:看来我的启动代理文件必须由拥有root:wheel。穿好后,我尝试

sudo launchctl load ~/Library/LaunchAgents/retrmail.plist

它没有发出任何错误。而且我认为我的守护进程运行正常。我将这个问题保留为开放状态,因为我记得启动的文档明确指出启动代理文件可以由运行守护程序的用户拥有。


UPDATE2:不,它运行不正常。它只运行了一次,但没有再次运行,就好像已卸载一样。


UPDATE3:我升级到优胜美地公开测试版3,并将我的代理更改为

<?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>org.darksair.retrmail</string>
    <key>ProgramArguments</key>
    <array>
      <string>/Users/darksair/bin/retrmail.py</string>
    </array>
    <key>StartInterval</key>
    <integer>300</integer>
    <key>UserName</key>
    <string>darksair</string>
    <key>EnvironmentVariables</key>
    <dict>
      <key>PATH</key>
      <string>/Users/darksair/Python/bin:/Users/darksair/Python3/bin:/Users/darksair/bin:/usr/local/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin</string>
    </dict>
    <key>StandardOutPath</key>
    <string>/Users/darksair/logs/retrmail.log</string>
    <key>StandardErrorPath</key>
    <string>/Users/darksair/logs/retrmail.log</string>
  </dict>
</plist>

我重新加载了该代理,现在我认为它可以正常工作。我仍未解决此问题,因为我不知道我以前的列表有什么问题。


总之,我发现必须将plist的所有者更改root:wheel为才能加载它。


这在优胜美地决赛中有效吗?
TJ Luoma

@TJLuoma:是的。只要plist由root:wheel拥有。
MetroWind 2014年

Answers:


21

man launchctl

请注意,每个用户的配置文件(LaunchAgents)必须归root用户(如果它们位于/ Library / LaunchAgents中)或由用户加载(如果它们位于$ HOME / Library / LaunchAgents中)。所有系统范围的守护程序(LaunchDaemons)必须由root拥有。配置文件必须禁止组和全局写入。出于安全原因,这些限制是适当的,因为允许对已启动的配置文件进行写操作就可以指定要启动的可执行文件。

修复是

sudo chmod 600 /Library/LaunchDaemons/x.plist
sudo chown root /Library/LaunchDaemons/x.plist

2
“或用户加载它们” <-这是我遇到的问题。
MetroWind 2014年

2
我不是UNIX专家,但它说“禁止团体写作和世界写作”。由于可能仍需要阅读,因此不是chmod 644吗?
2014年

5

奇怪的是,使用sudo是您的问题。通过使用sudo,您不再是您自己,因此您不是您自己文件的所有者。删除sudo,重复该命令,它应该可以正常加载。对这一切的哲学方法感到抱歉。


4

找到了解决方案。

在这种情况下,正确的命令是

launchctl bootstrap gui/501 ~/Library/LaunchAgents/retrmail.plist

要卸载

launchctl bootout gui/501 ~/Library/LaunchAgents/retrmail.plist

launchctl load虽然不知道为什么需要root用户,但是无论如何都不赞成使用load / unload。


手册页列出了引导而不是bootcut。我认为自动更正让您着迷,因为在我的机器上,它会将启动更改为bootcut。
史蒂夫·摩泽

@MetroWind我正在使用上述命令找不到Code = 112错误的域。其不一致。有什么线索吗?
Parag Bafna

您还需要chmodchown吗?
Itachi

@Itachi,不。保留默认所有者和权限应该没问题。
MetroWind

@ParagBafna,我不确定。也许您的UID不是501?
MetroWind

3

也尝试使用此用户,而不是root拥有的.plist(应该可以这样做)

$ load ~/Library/LaunchAgents/com.blash.blah.plist
Could not find domain for 

我没有通过控制台远程登录时(无头),这似乎是我的问题-至少用户管理的服务需要用户在主屏幕上登录(我最终这样做了)通过远程管理登录,因为这是一台无头机器)

IMO,即使您不亲自登录也希望它运行,您可以选择:

  • 自动使您的帐户登录(请注意安全隐患,也没有答案之一中提到的UserName标记)

  • 如各种建议中所述,使文件成为根目录所有者(使用已有的UserName将用户重新设置为有效用户)


2
非常感谢。我在您的答案中找到了解决方案。
撤退

2

这是一个愚蠢的主意。

升级到优胜美地后,我也遇到了同样的错误。我错误地认为这意味着对.plist文件的不良所有权/权限,但实际上由于某种原因,我在plist中引用的二进制文件(在我的情况下为cassandra)丢失了其可执行位。

chmod + x'ing修复了它。

可能不是您的问题,但值得一试:)


但是,这不适用于我的情况。我的可执行文件确实具有x权限位。但是还是要感谢您的回答。希望它可以对其他人有所帮助。
MetroWind 2014年

2

删除UserName键和字符串。

问题是该UserName密钥只能在由root用户启动进程的情况下使用。如果plist由root拥有,则只能以root身份启动。基本上,该过程由root启动,然后引导到指定的用户。如果希望此过程自己运行,请将plist放在〜/ Library / LaunchAgents文件夹中,然后删除UserName键。


在删除zabbix_agend的“ UserName”选项后,它可以正常工作。谢谢!- gist.github.com/chusiang/04db38f5173784e33b68
楚Saing赖

奇怪…删除了“ UserName”后,它仍然无法加载…
MetroWind

1

您是否要手动重新加载具有用户权限的代理?我不完全理解为什么需要执行这些操作,但是我认为您需要附加到用户域(以root身份运行时似乎未附加)。使用这些功能重新连接对我有用。

function as_user {
    local user="$1"
    local user_pid=$(ps -axj | awk "/^$user / {print \$2;exit}")
    local command="sudo launchctl bsexec $user_pid sudo -u '$user' $2"
    echo "Running:"
    echo "$command"
    eval $command
}

function as_current_user {
    as_user "$(whoami)" "$*"
}

function reload_agent {
    as_current_user launchctl unload "$1"
    as_current_user launchctl load "$1"
}

您将按以下方式使用它:

reload_agent ~/Library/LaunchAgents/com.hw.helloworld.plist

bsexec将您带回到您的域中,并允许您将任务添加为用户启动代理。


它说:/Users/darksair/Library/LaunchAgents/retrmail.plist:操作已在进行中。在这一点上,我的问题基本上是:为什么kickstart命令不起作用?为什么我必须将plist所有权设置为root…?
MetroWind 2014年

1
您不应将plist文件的所有者设置为root。〜/ Library / LaunchAgents中的所有内容均应归该目录所属的用户所有。当我在加载命令之前没有卸载该命令时,我已经获得了“操作已在进行中”的信息。您是否在使用我提供的功能?
imalison 2014年

是。我正在使用您的功能。我确实先卸载了列表...
MetroWind 2014年

我只是尝试加载您提供的第一个plist,它对我有用。为文件设置了哪些权限?
imalison 2014年

对于许多事情来说,这是一段令人难以置信的代码。我混合使用p和自定义bash脚本来管理许多不同的macOS设备,由于安全审核会话或用户域不正确,随机问题非常普遍。做得好!
安德鲁·怀特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.