2

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

我尝试添加一个 shell 脚本作为启动 exe 的启动代理,以便可执行文件不会将消息记录到控制台。但是脚本不会启动垃圾箱。

这是我的启动代理 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>
4

3 回答 3

4

StandardOutPath您可以通过将和StandardErrorPath键添加到 .plist 文件来覆盖启动作业的 stdout 和 stderr 的默认处理。要丢弃所有输出,请添加:

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

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

于 2012-07-04T22:15:29.713 回答
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 已填满,但没有我的应用程序的迹象。令人惊讶的是,当我从脚本中删除“&”时,启动代理开始正常工作。

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

变成

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

我不确定为什么 Mac 将后台进程作为 launchd 的不同之处。当我手动运行脚本时,该脚本工作正常。

于 2012-07-04T19:30:06.183 回答
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
于 2012-07-04T18:31:38.480 回答