停止失敗

現象:

実行 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 拡張に相応の環境変数が設定されていない場合、起動時に余分なフォークプロセスが生成され、停止時に失敗することがあります。