2017-09-27 68 views
0

我試圖在OSX Sierra上定期運行postgres查詢,並且發現我應該使用launchd的建議。我創建了一個plist文件,它調用一個包含postgres查詢的簡單shell腳本,將plist文件複製到LaunchAgents文件夾中並加載它。但是,它似乎並沒有工作。在launchd中運行postgres查詢

如果我運行shell腳本是一些簡單的像:

echo "Hello" > /Users/agentzel/Documents/temp.txt 

它工作得很好 - 每30秒,它刷新該文件以單詞「你好」。但是,如果它是像以下這樣的postgres查詢,我不會得到任何輸出。

psql -U agentzel -d dvdrental -c 'select count(*) from film;' > /Users/agentzel/Documents/temp.txt 

這些命令都工作得很好,當我在命令行中運行它們,但當由​​LaunchAgent稱爲Postgres的查詢不起作用。我對postgres或launchd都沒有太多的瞭解,所以我希望能夠深入瞭解我做錯了什麼。

如果它是相關的,這裏是我的launchd文件:

<?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.test.database_info_sample</string> 
    <key>ProgramArguments</key> 
    <array> 
     <string>/Users/agentzel/Documents/test.sh</string> 
    </array> 
    <key>StartInterval</key> 
    <integer>30</integer> 
</dict> 
</plist> 

(其中test.sh只包含我試圖運行命令)

編輯:如果沒有人熟悉特別的問題,有沒有簡單的方法來調試launchd?如果launchd或postgres報告錯誤,是否有文件可以檢查錯誤消息/代碼?

+0

嘗試重定向錯誤輸出到一個文件,以'PSQL ...> ... 2> error.txt'它可能給你一個線索,什麼是錯的 – Eelke

回答

1

使用Launchd配置來設置STDOUT位置,而不是shell腳本中的pipe(> ..txt)。

<!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.test.database_info_sample</string> 
     <key>ProgramArguments</key> 
     <array> 
     <string>/Users/agentzel/Documents/test.sh</string> 
     </array> 
     <key>StartInterval</key> 
     <integer>30</integer> 
     <key>StandardErrorPath</key> 
     <string>/Users/agentzel/Documents/temp_err.txt</string> 
     <key>StandardOutPath</key> 
     <string>/Users/agentzel/Documents/temp.txt</string> 
    </dict> 
    </plist> 
+0

謝謝!我至少可以明白爲什麼它現在不工作!原來,它無法找到psql,即使它在我的路徑中。 (psql位於/ usr/local/bin,這是$ PATH中的第一個條目)如果我包含psql的完整路徑,它現在可以工作,但確實啓動時檢查PATH的其他位置? – Amanda

+0

我認爲幾乎沒有任何東西是默認傳遞的。您可以使用EnvironmentVariables將PATH設置爲所需的值。 –