単一のユニットで実行されるPythonスクリプトの出力は順序がありませんが、シェルは影響を受けないようです。

単一のユニットで実行されるPythonスクリプトの出力は順序がありませんが、シェルは影響を受けないようです。

システム管理python2スクリプトのすべての出力を端末に表示されるように、すぐにログに入れることができる方法は何ですか?

私はcentos 7を使っていますが、アーチでも同じようです。

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

ベストアンサー1

標準出力はバッファリングです。それはおそらくシステムリダイレクトによるものです。

書き込みまたはPYTHONUNBUFFERED環境の後にsys.stdout.flush()を追加すると、この問題は解決されます。

スタックオーバーフローの質問も参照してください。Python出力バッファリング

おすすめ記事