TermuxでProot Linuxディストリビューションをインストールし、RealVNC Viewerでシステムへログインすると、数秒もしないうちにThe connection closed unexpectedlyという警告が出ることがあります。
続いてTermuxに戻ると、端末に[Process completed (signal 9) - press Enter]というエラーが表示されています。TermuxのプロセスがAndroidシステムに停止されたということですが、スマホのRAMはまだ十分残っているはずなのに?
この問題はAndroid 12で導入された新しい仕組みに由来します。以下では原因を簡単に説明し、一時的な解決方法を紹介します。
1. Termuxでsignal 9エラーが発生する原因#
agnostic-apolloはPhantom, Cached And Empty Processesの記事で、Android 12に導入された新しい仕組みを詳しく説明しています。Androidシステムはアプリがforkした子プロセスを監視し、子プロセスが32個以上になるとそれらを終了させ、CPUリソースの過剰な占有を防ぎます。
この仕組みは"Phantom Processes Killing"と呼ばれています。開発者がいちばん見たくない状況なので、影のプロセスキラーという名前が付いたわけです。
開発者からの要望を受け、GoogleはAndroid 12LおよびAndroid 13以降にPhantom Processes Killingを無効化するオプションsettings_enable_monitor_phantom_procsを追加しました。ただし、ユーザーはADBコマンドで手動で無効化する必要があります。つまりこれはGoogle Android側の問題であり、Termux開発者はまだ正式な解決策を見つけていません。以下のコマンドで無効化する方法はagnostic-apolloが提示したものです。
Termuxの場合、Phantom Processes Killingによって、Termuxでコマンドを実行している最中にシステムからランダムに停止されることがあります。Proot distroでGUI環境を動かすとなれば、当然さらに多くの子プロセスが作られます。特にバックグラウンドへ切り替えてVNC Viewerで接続しようとすると、スマホのRAM容量に関係なくPhantom Processes Killingが発動します。その後Termuxに戻ると、[Process completed (signal 9) - press Enter]というエラーメッセージが表示されます。
2. Termuxのsignal 9エラーを解決する#
Termuxが落ちる問題を解決するには、コマンドを実行してPhantom Processes Killingを無効化します。ただし、一部アプリのバックグラウンドプロセスも制御されなくなる可能性があります。
ほとんどのAndroidスマホにはGoogle Playサービスフレームワークが入っています。GMSは不定期にデバイス設定を上書きするため、これもあわせて無効化する必要があります。ただしGMSの上書きを止めると、スマホがブートループする可能性があります。自己責任で行ってください。
動画版チュートリアル
2.1. スマホにRoot権限がない場合#
Android 14以降:システム設定 → 開発者向けオプション → 「子プロセスの制限を停止」をオフにして、再起動すれば完了です。
Android 14未満の場合は、以下を読んでください。
以下の手順ではパソコンが必要です。パソコンがない場合は、TermuxでワイヤレスADBデバッグを行う方法を試せます。
Android公式サイトからWindows版のPlatform Toolsをダウンロードし、解凍します。
platform_toolsディレクトリに入ると、ADBとFastbootの実行ファイルがあります。ここでSHIFT + 右クリックし、ターミナル(またはPowershell)を開きます。スマホでシステム設定 → 端末情報を開き、ビルド番号を5回タップします。その後「開発者向けオプション」を検索して入り、「ADBデバッグ」を有効にします。
スマホをパソコンに接続し、Windowsのターミナルで以下のコマンドを入力します。スマホ側でデバッグを許可してください。
./adb devices- 続いてAndroidのバージョンに応じて、以下のコマンドを実行します。
# Android 12LおよびAndroid 13以降
./adb shell "settings put global settings_enable_monitor_phantom_procs false"
# Android 12:
./adb shell "/system/bin/device_config set_sync_disabled_for_tests persistent; /system/bin/device_config put activity_manager max_phantom_processes 2147483647"- 再起動すれば完了です。
2.2. スマホにRoot権限がある場合#
- Termuxを開き、suに切り替えてroot権限を取得します。
su- Androidのバージョンに応じてコマンドを実行します。
# Android 12LおよびAndroid 13以降:
su -c "settings put global settings_enable_monitor_phantom_procs false"
# Android 12:
su -c "/system/bin/device_config set_sync_disabled_for_tests persistent; /system/bin/device_config put activity_manager max_phantom_processes 2147483647"- 再起動すれば完了です。

