非常简单的Launchd plist没有运行我的脚本。

37

我正在尝试弄清楚为什么我的launchd脚本无法工作。它非常简单,但我对Mac环境还很陌生,正在努力适应。这是我的plist文件。我知道ProgramArguments是必需的,所以我只把脚本路径放进去了。

<?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.tomcat.plist</string>   
  <key>ProgramArguments</key>  
  <array>  
    <string>/opt/apache-tomcat-5.5.27/bin/startup.sh</string>  
  </array>  
  <key>OnDemand</key>  
  <false/>  
</dict>  
</plist>

我尝试运行命令 launchctl load <name>,看起来它已经成功加载(因为没有出现错误消息),但是脚本似乎没有执行,即使在重新启动后也是如此。

我尝试了在线上找到的所有示例,但无法弄清楚为什么这个脚本不会在启动时运行。

3个回答

57

以防其他人遇到此问题,并且已经在他们的plist中使用了<key>RunAtLoad</key><true/>,我想提供一些额外的解决方案。

仔细检查权限以确保您的脚本是可执行的(查找“x”):

ls -l /opt/apache-tomcat-5.5.27/bin/startup.sh

如有必要,请修改权限:

chmod +x /opt/apache-tomcat-5.5.27/bin/startup.sh

还要先直接运行脚本,并确保它能正常工作:

/opt/apache-tomcat-5.5.27/bin/startup.sh

如果脚本是可执行的,并且可以直接运行良好,请尝试跟踪系统日志以调试launchd:
sudo launchctl log level debug 
tail -f /var/log/system.log

-f 标志(基本上)持续显示日志的末尾(最新条目)。您可以删除此标志,以仅打印日志末尾的快照。如果使用此标志,则需要打开一个新终端来运行其他命令。按CTRL + C结束tail会话。更多信息:

man tail

当你完成调试时:

sudo launchctl log level error

还有其他日志级别。更多信息请参考:

man launchctl

如果您对脚本或属性列表进行了任何更改,请确保重新加载属性列表。例如:
launchctl unload ~/Library/LaunchAgents/com.tomcat.plist
launchctl load ~/Library/LaunchAgents/com.tomcat.plist

如果您只更改了脚本而没有更改 plist,则可以重新启动 plist:
launchctl stop com.tomcat.plist
launchctl start com.tomcat.plist

如果您将以下键值对添加到您的plist文件中:
<key>KeepAlive</key>
<true/>

然后你只需要运行:

launchctl stop com.tomcat.plist

它会自动重启。

如果所有这些都没有帮助,而您特别在设置Tomcat在OS X上遇到问题,则this tutorial可能会有所帮助。


我用一个测试脚本遇到了同样的问题... launchctl 的 'start' 和 'stop' 命令返回错误 "No such process"。 - Michael
3
@Michael startstop 接受标签作为参数而不是文件名。在上面的例子中,配置文件有 <string>com.tomcat.plist</string>,但你的可能只有 com.tomcat,所以 launchctl start com.tomcat 应该可以工作。 - Matt Briançon
21
可爱。"sudo launchctl log level error"不再被实施。 - Michael
1
我仍然无法让它工作。尝试手动执行,但出现以下错误:/Users/user/Library/LaunchAgents/com.xyz.plist: Operation not permitted。我们是否还需要为plist文件设置可执行权限?-rw-r--r-- 1 user group 997 May 7 17:28 /Users/user/Library/LaunchAgents/com.xyz.plist。我正在使用puppet来执行它。它还打印了launchctl load com.xyz.plist作为调试消息,但相应的Java jar未被启动。 - Albatross

16
为了让你的脚本在调用launchctl load时自动运行,你需要添加:-
<key>RunAtLoad</key>
<true/>

或者您可以使用:-

launchctl start com.tomcat.plist

3
虽然我想大多数人不会遇到这个问题,但考虑到我花了近两个小时才弄清楚为什么“launchd load”尽管返回了“0”退出代码,但仍无法正常工作,我认为把它放在这里还是值得的。
问题很简单。我的“plist”文件有错误的文件扩展名(我使用了“plst”),而“launchctl”默默地拒绝加载该文件。将扩展名更改为“plist”即可解决此问题。

2
谢谢!在我的情况下,我忘记了plist后缀,并且没有任何警告。 - Hot.PxL

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接