2012-07-04 22 views
2

我正在爲我的應用程序創建Mac啓動代理程序。啓動代理工作正常。但是當可執行文件在終端中啓動時,可執行文件會打印一些控制檯消息,並將所有這些消息記錄到Mac控制檯。我如何跳過將這些消息記錄到Mac控制檯..?如何跳過將可執行文件打印到Mac控制檯上

我已經嘗試添加一個shell腳本作爲一個勞拉代理,它啓動該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> 
+0

什麼生成消息;你的代碼或一些庫代碼? – trojanfoe

+0

我的代碼。其實我需要這些消息以防發生一些問題。 –

+0

那麼爲什麼不把它們寫入一個文件(比如'〜Library/Caches')而不是寫入'stderr'? – trojanfoe

回答

3

通過將StandardOutPathStandardErrorPath鍵添加到.plist文件中,您可以覆蓋launchd作業的stdout和stderr的默認處理方式。要放棄所有輸出,請添加:

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

您也可以將一個或兩個重定向到日誌文件。

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 
+0

我已經在我的腳本中完成了這個人,./bin/Mybin 1>/dev/null 2>/dev/null,問題是腳本沒有啓動Mybin。 –

+0

請注意我在我的工作雖然...我用'dirname'完全解決路徑。如果你只是使用'./',它將被解釋爲一個相對路徑,並且它是相對於當腳本由系統運行時任何目錄是最新的(可能是任何東西)。如果你拿上面的例子,但是用/ bin/Mybin替換'/ run_real_agent'會怎樣? –

+0

這是我的腳本 #!/斌/慶典 CD /應用程序/ MyApp的/ 日期='date' 回聲 「埃克開始在::: $ {日期}」> proc.log #開始的Exe 。/ bin/MyBin 1>/dev/null 2>/dev/null&echo $! > proc.pid –

2

最簡單的方法就像Gordon Davisson所說的那樣。但是,當我需要啓動多個可執行文件時,則可能通過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 

我不能確定爲什麼蘋果正在後臺進程中的launchd的差異。腳本是&工作正常,因爲它是當我手動運行它。

+1

launchd預計它開始停留在前臺的進程,所以它可以關注它們。如果您的腳本產生後臺進程然後退出,launchd會認爲該任務已完成,並清除(即殺死)任何剩餘的後臺進程,然後可能會重新啓動主腳本。解決方案:不要背景實際的工作!如果您必須將其添加到後臺,請將' KeepAlive放棄進程組'添加到.plist以更改launchd的默認行爲。 –

相關問題