3

あなたの助けが必要です !

サーバー上で一連のコマンドを定期的に実行する必要があるレポートデーモン(c ++)を作成しました。

簡単なコマンド例は次のようになります: "/ bin / ps aux | / usr / bin / wc -l"

最初のアイデアは、popen()を使用してコマンドを実行する子プロセスをforkし、コマンドがまだ終了していない場合に5秒後に子を強制終了するように親プロセスにalarm()を設定することでした。

コマンドとして「sleep20000」を使用してみましたが、子プロセスは強制終了されましたが、sleepコマンドはまだ実行されています...良くありません。

2番目のアイデアは、popen()の代わりにexeclp()を使用することでした。これは、「ls-lisa」や「sleep20000」などの単純なコマンド(つまり、パイプなし)で機能します。結果を得ることができ、5秒後にプロセスが実行されない場合、プロセスは強制終了されます。

ここで、その「/ bin / ps aux | / usr / bin / wc -l」コマンドを実行する必要があります。明らかに、execlp()で直接機能しないため、「ハック」を試しました。

execlp("sh","sh","-c","/bin/ps aux | /usr/bin/wc -l",NULL);

私は働いています...またはそう思った...私は試しました

execlp("sh","sh","-c","sleep 20000",NULL); 

念のために言っておきますが、子プロセスは5秒後に強制終了されます(私のタイムアウト)が、sleepコマンドはそのまま残ります...

私は提案を受け入れています(私はハックに落ち着きます)!

前もって感謝します !

TLDR;

私はする方法が必要です:

  • 「/bin/ psaux | / usr / bin/wc-l」などの「複雑な」コマンドを実行します
  • その出力を取得します
  • 5秒以上かかる場合は、強制終了するようにしてください(psコマンドは単なる例であり、実際のコマンドは永久にハングする可能性があります)
4

1 に答える 1

6

timeoutcoreutils のコマンドを使用します。

/usr/bin/timeout 5 /bin/sh -c "/bin/ps aux | /usr/bin/wc -l"
于 2013-01-07T10:22:19.413 に答える