Systemd
作為單元執行的 python 腳本的輸出出現故障,而 shell 似乎未受影響
我如何將 systemd 託管 python2 腳本的所有輸出立即寫入日誌,就像它出現在終端中一樣
我在centos 7上,但在arch上似乎相同
根據 systemd 手冊,stdout 和 stderr 應該自動進入日誌
系統配置
#DefaultStandardOutput=journal #DefaultStandardError=inherit
這是我的單位
/usr/lib/systemd/system/tick.service
[Unit] Description=Tick [Service] Type=simple ExecStart=/home/stack/tick
腳本
#!/usr/bin/python import time import sys print "Tick" sys.stderr.write('First error\n') time.sleep(10) sys.stdout.write("Tick\n") sys.stderr.write('Second error\n') time.sleep(10)
這是日記的輸出,注意時間和順序
Oct 30 14:30:41 controller systemd[1]: Starting Tick... Oct 30 14:30:41 controller systemd[1]: Started Tick. Oct 30 14:30:41 controller tick[5020]: First error Oct 30 14:30:51 controller tick[5020]: Second error Oct 30 14:31:01 controller tick[5020]: Tick Oct 30 14:31:01 controller tick[5020]: Tick
使用 python3 甚至 stderr 也會延遲到程序結束
我嘗試了類似的c程序,似乎是一樣的
但這似乎不會影響 bash 腳本
#!/bin/bash echo "Tick" echo "First error" 1>&2 sleep 10 echo "Tick" echo "Second error" 1>&2 sleep 10
雜誌
Oct 30 14:41:36 controller systemd[1]: Starting Tick... Oct 30 14:41:36 controller systemd[1]: Started Tick. Oct 30 14:41:36 controller tick[5084]: Tick Oct 30 14:41:36 controller tick[5084]: First error Oct 30 14:41:46 controller tick[5084]: Tick Oct 30 14:41:46 controller tick[5084]: Second error
標準輸出被緩衝,可能是因為 systemd 重定向
在寫入或 PYTHONUNBUFFERED 環境後添加 sys.stdout.flush() 將解決此問題
另請參閱 Stack Overflow 問題Python 輸出緩衝。