如何跳过将可执行文件打印到Mac控制台

时间:2012-07-04 15:18:44

标签: macos launchd

我为我的应用创建了一个Mac Launch Agent。启动代理工作正常。但是,当exe在终端中启动并且所有这些消息都记录到Mac控制台时,可执行bin文件会打印一些控制台消息。如何跳过将这些消息记录到Mac控制台..?

我尝试添加一个shell脚本作为Lauch Agent,它启动了exe,因此可执行文件不会将消息记录到控制台。但剧本并没有启动垃圾箱。

这是我的Launch Agent 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.myapp</string>
  <key>Program</key>
  <string>./bin/MyBin</string>
  <key>WorkingDirectory</key>
  <string>/Applications/MyApp/</string>
  <key>RunAtLoad</key>
  <true/>
  </dict>
  </plist>

3 个答案:

答案 0 :(得分:3)

您可以通过向.plist文件添加StandardOutPathStandardErrorPath键来覆盖stdout和stderr对launchd作业的默认处理。要丢弃所有输出,请添加:

<key>StandardOutPath</key>
<string>/dev/null</string>
<key>StandardErrorPath</key>
<string>/dev/null</string>

您还可以将其中一个或两个重定向到日志文件。

答案 1 :(得分:2)

最简单的方法是戈登戴维森上面所说的。但是当我需要启动多个可执行文件时,它可以通过shell脚本实现。

这是我的剧本:

  #!/bin/bash
  cd /Applications/MyApp/
  dates=`date`
  echo "Exe Started at ::: ${dates}" > proc.log
  # Starting Exe
  ./bin/MyBin 1>/dev/null 2>/dev/null & echo $! > proc.pid

我遇到了这个脚本的问题。我可以看到proc.log填满,但没有我的应用程序的迹象。令人惊讶的是当我删除了'&amp;'从脚本开始,启动代理开始正常工作。

   ./bin/MyBin 1>/dev/null 2>/dev/null & echo $! > proc.pid

已更改为

   ./bin/MyBin 1>/dev/null 2>/dev/null

我不确定Mac为什么将后台进程作为launchd的一个区别。剧本是&amp;当我手动运行它时,工作正常。

答案 2 :(得分:1)

输出只能在流程开始之前重定向。在这种情况下,如果您不想更改所有代码,则启动代理的可执行文件将需要是脚本。然后,脚本可以根据需要重定向,例如

#!/bin/sh
# redirect to a log file, /dev/null, or wherever it should go;
# this is just an example log file destination
`/usr/bin/dirname $0`/run_real_agent > /tmp/my_agent.$$.log 2>&1