2017-04-25 75 views
0

我使用systemd在Raspbian(Jessie)上設置了一項服務,使其在啓動後啓動。守護進程的配置是這樣的:如何正確地從Raspbian的systemd服務重定向stdout/stderr?

[Unit] 
After=multi-user.target 

[Service] 
Type=idle 
User=root 
ExecStart=/bin/sh -c "exec /home/pi/sources/mydaemon.py >> /home/pi/mydaemon.log 2>&1" 

[Install] 
WantedBy=multi-user.target 

這重定向>>不工作。我嘗試了StandardOutputStandardError的大部分可用選項,但它們永遠不會將我的腳本輸出結果打印到/var/log/daemon.log,並且journalctl -u mydaemon.service僅顯示有關正在啓動和停止的服務的消息。

我對當前腳本中的文件描述符沒有任何好笑的地方。我只想讓我的print()logging.info()陳述出現在我可以閱讀的地方。有任何想法嗎?

(只是要清楚,守護程序也必須以root身份運行。莫非是有什麼與我的打印問題?)

回答

2

通常你只需直接運行服務(確保它的可執行文件有一個家當線):

ExecStart=/home/pi/sources/mydaemon.py 

和使用StandardOutput=默認重定向到systemd日誌,這樣你就可以journalctl -u mydaemon.service讀取日誌。

Systemd很好地控制了日誌的文件增長和文件輪換。

你的服務作爲root運行是無關緊要的。

如果您沒有看到上述任何日誌輸出,同時檢查整個日誌附近的日誌,可能是由於您的服務:

journalctl 

這是必要的,因爲有一個已知的問題時,一些腳本存在之前的最後一行日誌可能不會歸因於該腳本。這對於在退出前只運行幾分之一秒的腳本尤其明顯。

+0

這似乎是工作只是一部分的時間。我不知道Raspbian Jessie上的systemd或journalctl有什麼問題,但我懷疑有一個問題會干擾日誌記錄。我的腳本推文,所以我知道它何時被激活,但腳本中的打印語句通常不會顯示在日誌中。 – Eric

+0

結合你的答案,我會從我的腳本中嘗試這種方法,看看我是否有更好的運氣(明確地發送消息到期刊)http://stackoverflow.com/questions/34588421/how-to-登錄到journald-systemd-通過的Python – Eric

3

我需要使用-u參數運行python以確保消息不被緩存。

有了這條線,打印線被添加到立即日記:

ExecStart=/home/pengman/scripts/mqtt_monitor/venv/bin/python -u home/pengman/scripts/mqtt_monitor/src/mqtt_monitor.py 

(我是一個的virtualenv中運行,但是這不應該的問題)