1

私はDaemon::Simpleいくつかのスクリプトをすばやくデーモン化し、それらを起動/停止できるようにするために使用しています。ただし、これらのスクリプトの一部は python で記述されているため、通常は python スクリプトと呼びDaemon::Simple::Init()ますexec()

Daemon::Simple::Init()しかし、 と が閉じSTDOUTていることがわかりました。その結果、とSTDERRへの書き込み時に Python スクリプトが壊れる (単に終了する) ようです。execの前にそれらを再度開いてファイルにリダイレクトしても役に立ちません。STDOUTSTDERRSTDOUTSTDERR

私が見つけたのは、次のソースを変更することですDaemon::Simple

close(STDOUT);
close(STDERR);

に:

open STDOUT, "/dev/null"
open STDERR, "/dev/null"

以前のように呼び出した後、再度開いSTDOUTSTDERR実際のファイルにリダイレクトするとDaemon::Simple:Init()、今回は機能します。閉じSTDOUTSTDERR再度開くと何らかの形で投稿exec()が壊れているようですが、それらを開いて/dev/null再度開くと正常に機能します。

とにかく、どちらが生き残るかを変更せずにSTDOUT、再開または開いたままにすることができますか?STDERRDaemon::Simpleexec()

4

2 に答える 2

3

STDERR と STDOUT を再度開くために使用していたのと同じ行ですか? その場合、書き込み用ではなく読み取り用に開いている可能性があります。使ってみて

open STDOUT, '>', '/dev/null';
于 2012-11-20T15:11:38.273 に答える
1

これはうまくいきますか?

use Daemon::Simple;

open(SAVEOUT, ">&STDOUT");
open(SAVEIN, "<&STDIN");

Daemon::Simple::init("daemon");

open(STDOUT, ">&SAVEOUT");
open(STDIN, "<&SAVEIN");

exec("python-script") or die "exec failed: $!";
于 2012-11-20T19:37:44.163 に答える