このPythonスクリプトの出力をログファイルに追加するにはどうすればよいですか?
sudo inotifywait -mr --format '%e%w%f' --event move $srdir | python3 /usr/bin/m-sync.py $bkdir $srdir >> /mnt/msync.py.log2
動作しません。エラーメッセージはなく、修正されていない空のログファイルのみがあります。
これにより、sudo inotifywait -mr --format '%e%w%f' --event move $srdir | python3 /usr/bin/m-sync.py $bkdir $srdir
期待どおりに出力がコンソールに移動します。
最終的には、 sudo inotifywait -mr --format '%e%w%f' --event move $srdir | python3 /usr/bin/m-sync.py $bkdir $srdir >> /mnt/msync.py.log2
サービスとしてsystemdによってスクリプトで実行されますが、コマンドラインから手動で実行してもまだ記録されていないため、重要ではないと思います。
いずれの場合も、スクリプトは実際には正しく動作しますが、ログに出力を取得することはできません。
場合に備えてPythonスクリプト:
#!/usr/bin/python3
import sys
import time
from subprocess import call
src = ""
bkdir = sys.argv[1]
srdir = sys.argv[2]
while True:
line = sys.stdin.readline()
event, path = line.split("/",1)
path="/"+path.rstrip();
if event in ["MOVED_FROM","MOVED_FROM,ISDIR"]:
src = path.replace(srdir, bkdir, 1)
if event in ["MOVED_TO","MOVED_TO,ISDIR"]:
dst = path.replace(srdir, bkdir, 1)
sys.stdout.write(time.strftime("%Y-%m-%d %H:%M:%S") + " mv " + src + " " + dst )
call(["mv", src, dst])
編集:明らかにsudo inotifywait -mr --format '%e%w%f' --event move $srdir | sudo python3 /usr/bin/m-sync.py $bkdir $srdir >> /mnt/msync.py.log2
コマンドラインで実行すると機能します。 Pythonを呼び出す前に、2番目のsudoをメモしてください。ただし、systemdで実行すると、すべてがデフォルトでルートであり、まだログに出力されません。
答え1
~からhttps://stackoverflow.com/a/3167526/7192818
これがPythonにも当てはまるかどうかはわかりませんが、実行しているOSによって異なると思います。
たとえば、Linuxから端末への出力は改行時にバッファをフラッシュしますが、ファイルへの出力の場合はバッファがいっぱいになったときにのみ(デフォルトで)フラッシュされます。これは、バッファをあまり頻繁にフラッシュする方が効率的で、ファイルの改行で出力がフラッシュされない場合にユーザーが気付く可能性が低いためです。
必要に応じて出力を自動的に更新することもできます。
したがって、Pythonスクリプトでsys.stdout.flush()
書き込み後に追加すると、期待どおりに機能します。
まあ。