2016-12-07 27 views
2

PHP警告:EXEC(): ライン上some.phpにおける[RM some_file.txt]フォークすることができません111PHP警告:EXEC():フォークすることができない

問題があることこの件について前に尋ねられましたPHP Warning: exec() unable to fork私は同様の問題を抱えていますが、それは同じではありません。

ulimit -a 

core file size   (blocks, -c) 0           
data seg size   (kbytes, -d) unlimited         
scheduling priority    (-e) 0           
file size    (blocks, -f) unlimited         
pending signals     (-i) 31364          
max locked memory  (kbytes, -l) 64          
max memory size   (kbytes, -m) unlimited         
open files      (-n) 1024          
pipe size   (512 bytes, -p) 8           
POSIX message queues  (bytes, -q) 819200         
real-time priority    (-r) 0           
stack size    (kbytes, -s) 10240          
cpu time    (seconds, -t) unlimited         
max user processes    (-u) 31364          
virtual memory   (kbytes, -v) unlimited         
file locks      (-x) unlimited 

私の制限は上記に示されており、このエラーに影響する可能性のあるサーバには制限がないようです。

変数をアンセットして使用した後で変数を設定解除し、メモリを解放するためにnullに設定してみました。しかし、それは効果がありません。

一部のリソースを使い果たしたためにエラーが発生する可能性がありますが、その理由が見つかりません。 私はどのログを見るべきか教えていただけますか?

この問題の解決策または回避策はありますか?

+1

exec()の出力はあなたにヒントを与えますか?戻りコードをキャッチし、https://stackoverflow.com/questions/20648949/php-warning-exec-unable-to-forkのように検査します。 'PHP Warning'を' ErrorException'にルーティングし、それらを処理することは常に良い考えです。 – spinkus

+0

ログの点で。 '/ var/log/syslog'には、' max user processes'や違反が表示されます。 – spinkus

+0

@ S.Pinkus提案に感謝します。すぐに試してみます –

答えて

1

この問題に関する任意のアイデアや回避策はありますか?

問題はおそらくあなたのコードの脆弱性です。https://stackoverflow.com/a/20649541/2038383のようです。だからこそ回避策があります。

私はどのログを見てくださいか教えてください。

PHPログがあり、システム/カーネルのログがあります。

PHPログの入手先とデフォルトの設定はすでに分かっています。残念ながら、あなたはPHPをはるかに上回らないでしょう。あなたはset_error_handler()でエラーを自分で捕まえることができますが、それはあなたにもっと有用な情報を与えません(UNIXのerrnoではなくPHPの "errno"を与えるでしょう)。

システムログについては、私はコメントであなたのsyslogをチェックした。そこには何かがあるかもしれません、そして、それは常に良い出発点です。しかし、実際には、syslogのulimit違反は見られません。いくつかはログに記録されます(例:stack sizeはsegfaultを生成しますが、多くは記録されません)。この記事では、ulimit違反のログを取得する方法を説明しています:https://unix.stackexchange.com/questions/139011/how-do-i-configure-logging-for-ulimits。驚くほど些細なことではない。

ulimitシステムコールによって違反が報告されるはずのシステムは、errnoを設定します。たとえば、max user processesがヒットした場合、fork()EAGAINを返します。

だから、実際に何が起こっているのか知るためには、そのUNIX errnoにアクセスする必要があります。残念ながら私はPHPには道がないと思っています(posix_errno()がありますが、PHPのposix_XXX関数ライブラリに限られています)。また、それはPHP generating the "Unable to fork"のメッセージです。どのように実際のシステムコールエラーへのマップが完全に透過的ではないか。

他にもたくさんの方法があります。システム監視ツールのように:psdstatstraceは良いスタートかもしれません。

+0

詳細な回答ありがとうございました。 –

+0

心配する必要はありません。楽しかった。 – spinkus

関連する問題