2

別の Python スクリプト内から、cron、または gammu-smsd (素晴らしいモバイル ユーティリティ [gammu] を備えた SMS デーモン) の 3 つの異なる方法で呼び出される小さなサーバーで実行されている Python スクリプトがあります。スクリプトはメンテナンス用であり、システムの使用済みスペースを測定するための次のクラッジが含まれていました (おそらくこれは Python 内から可能ですが、これは迅速で汚いものでした)。

reportdict['Used Space'] = subprocess.check_output(["df / | tail -1 | awk '{ print $5; }'"], shell=True)[0:-1]

奇妙なことに、この行は、スクリプトが gammu-smsd から実行されているシェル スクリプトによって呼び出された場合にのみ失敗します。CalledProcessError オブジェクトの出力属性に正しい出力が含まれていても、この行は「終了ステータス 2 を返しました」という CalledProcessError 例外で失敗していました。このようなエラー ステータスを与えるシェル コマンド シーケンスの唯一のコマンドは awk で、ステータス 2 は致命的なエラーを示します。

この行を含む Python スクリプトが cron、別の Python スクリプト、またはコマンド ラインから呼び出された場合、この行は正常に機能します。これが問題に違いないと思って、スクリプトの環境を修正しようとして頭が壊れました。最後に、次のように stderr=subprocess.STDOUT に入れました。

reportdict['Used Space'] = subprocess.check_output(["df / | tail -1 | awk '{ print $5; }'"], stderr=subprocess.STDOUT, shell=True)[0:-1]

これは、何らかの出力が stderr に送信されているかどうかを判断するのに役立つデバッグ手段でした。しかし、この後、スクリプトは gammu-smsd から呼び出された場合でも機能し始めました! これはなぜでしょうか?サブプロセスを使用する際の今後の参考にさせていただきます...

4

1 に答える 1

2

Gammu SMSD は、すべてのファイル記述子を閉じた状態でスクリプトを呼び出します (ドキュメントを参照)。これがおそらく失敗の原因です。

于 2012-06-20T12:39:31.130 に答える