35

我试图弄清楚为什么我的启动脚本不起作用。这非常简单,但我是 mac 环境的新手,并试图习惯。这是我的清单。我知道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>时,它似乎正确加载(因为它没有给我任何错误消息),但脚本似乎没有执行,即使在重新启动时也是如此。

我已经使用了我在网上找到的所有示例,但我无法弄清楚为什么它没有在启动时运行我的脚本。

4

3 回答 3

52

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

仔细检查权限以确保您的脚本是可执行的(查找“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 结束尾部会话。了解更多信息:

man tail

完成调试后:

sudo launchctl log level error

还有其他日志级别。了解更多信息:

man launchctl

如果您对脚本或 plist 进行任何更改,请确保重新加载 plist。例如:

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

并且会自动重启。

如果这些都没有帮助,并且您在 OS X 上设置 Tomcat 时遇到了问题,那么本教程可能会有所帮助。

于 2013-04-04T19:54:08.477 回答
16

要使您的脚本在您调用 launchctl load 时自动运行,您需要添加:-

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

或者,您可以使用:-

launchctl start com.tomcat.plist
于 2009-10-07T16:46:11.540 回答
3

虽然我想大多数人不会有这个问题,但我认为值得把它放在这里,因为我花了将近两个小时试图弄清楚为什么launchd load尽管返回了0退出代码却没有工作。

问题很简单。我的plist文件有错误的文件扩展名(我有“ plst”),并且launchctl默默地拒绝加载文件。更改扩展以plist解决问题。

于 2019-01-19T22:29:23.150 回答