あなたの助けが必要です !
サーバー上で一連のコマンドを定期的に実行する必要があるレポートデーモン(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コマンドは単なる例であり、実際のコマンドは永久にハングする可能性があります)