exec コマンド内のパイプが機能しません。

exec コマンド内のパイプが機能しません。

スクリプトには次のコマンドがあります。

exec su -s /bin/sh -c 'exec "$0" "$@"  | ts "[%Y-%m-%d %H:%M:%S]"' user -- test.python $FULLPATH   &> log & 

FULLPATHテストPythonファイルのパスはどこにありますか?このコマンドを使用して、スクリプトの出力をコマンドのタイムスタンプとともにログファイルに記録したいと思いますts

これは実際には起こりません。出力はタイムスタンプなしで記録されます。それ以外は次のように試しました。

exec su -s /bin/sh -c 'exec "$0" "$@"' user -- test.python $FULLPATH  | ts "[%Y-%m-%d %H:%M:%S]" &> log & 

これにより、前のコマンドと同じ結果が得られます。

これが起こる理由と考えられる解決策のアイデアをいただきありがとうございます。ありがとうございます。

ベストアンサー1

execwithを使用すると&(問題の原因ではありませんが)、追加のフォークを節約できるという利点はほとんどありません。パイプラインコンポーネントの場合、シェルを使用してフォークを保存するのがわかりますが、最後のパイプラインコンポーネントzsh(他のパイプラインコンポーネントを待たないことをcmd1 | exec cmd2意味する)に適用された場合にのみ表示されます。zsh

tsここでは、pythonスクリプトstderrをfileに送信してもリダイレクトされませんlog。次のことができます。

su -s /bin/sh -c '
  "$0" "$@" 2>&1 |
    ts "[%Y-%m-%d %H:%M:%S]"
  ' user -- test.python "$FULLPATH" > log 2>&1 & 

おすすめ記事