停止失敗
現象:
実行 php start.php stop により stop fail というメッセージが表示されます。
第一の可能性
前提として、debug モードで workerman を起動している場合、開発者が端末で ctrl z を押したことで workerman に SIGSTOP シグナルが送信され、workerman がバックグラウンドに移動して停止(ポーズ)してしまい、stop コマンド(SIGINT シグナル)に応答できない状態です。
解決策:
workerman を起動した端末で fg (SIGCONT シグナルを送信) を入力して Enter を押し、workerman をフォアグラウンドで実行し、ctrl c (SIGINT シグナルを送信) を押して workerman を停止します。
停止できない場合は、以下の2つのコマンドを実行してみてください。
killall -9 php
ps aux|grep -i workerman|awk '{print $2}'|xargs kill -9
第二の可能性
stop コマンドを実行しているユーザーと workerman を起動したユーザーが一致していない場合、すなわち stop ユーザーには workerman を停止する権限がありません。
解決策:
workerman を起動したユーザーに切り替えるか、より高い権限を持つユーザーで workerman を停止します。
第三の可能性
workerman の主プロセスの pid ファイルが削除され、スクリプトが pid プロセスを見つけられなくなったため、停止に失敗しました。
解決策:
pid ファイルを安全な場所に保存する。詳細はマニュアルの Worker::$pidFile を参照してください。
第四の可能性
workerman の主プロセスの pid ファイルに対応するプロセスが workerman プロセスではありません。
解決策:
workerman の主プロセスの pid ファイルを開いて主プロセスの pid を確認します。pid ファイルはデフォルトで Workerman と同じディレクトリにあります。コマンド ps aux | grep 主プロセスpid を実行して、対応するプロセスが Workerman プロセスであるかどうかを確認します。もしそうでない場合、サーバーが再起動されて workerman が保存した pid が古いものである可能性があり、この pid が他のプロセスに使用されているため、停止に失敗します。この場合は pid ファイルを削除してください。
第五の可能性
grpc 拡張がインストールされていますが、grpc 拡張に相応の環境変数が設定されていない場合、起動時に余分なフォークプロセスが生成され、停止時に失敗することがあります。