私はこの質問を何度も受けましたが、これまでの答えは満足できないことを知っています。私は過去数日間、良い解決策を見つけようとしてきました、そして誰かが私に正しい方向を伝えることを願っています。
想像する:
- Ubuntu 22.04では、システムサービスとしてWebサーバーを起動しました。
- Webサーバーは、権限のないアプリケーションユーザーとして実行されます。
- Webサーバーはスクリプトを起動できる必要があります。
- このスクリプトはpg_restoreを実行します。
- スクリプトは、pg_restoreの実行中にWebサーバーサービスがpostgresに接続するのを防ぐことができる必要があります。
- 現在、スクリプトがWebサーバーサービス(親)を停止すると、そのスクリプト(サブ)も終了します。スクリプトがスタンドアロンプロセスとして生成されるのか、nohupを使用してバックグラウンドで実行されるのかは重要ではありません。親サービスが停止または再起動されると、スクリプトはすぐに終了します。
考えられる解決策1:アプリケーションユーザーのPostgresで接続を無効にします。
引用:https://stackoverflow.com/questions/3185266/postgresql-temporarily-disable-connections
問題:接続が復元された後でも、スクリプトはまだWebアプリケーションサービスを再起動する必要があり、これによりスクリプトが終了します。
考えられる解決策2:スクリプトを実行するための新しいサービスを作成します。
引用:長期実行独立プロセスを生成するシステムサービスを実行する「正しい」方法は何ですか?
問題:99.9%の時間に何もせずにスクリプトを一度だけ実行するシステムサービスを作成するのは厄介です。スクリプトにはroot権限がないため、いくつかのsudo体操なしで要求に応じてサービスを作成することは、私が欠けていない限り、選択肢ではないかもしれません。
考えられる解決策3:Web サーバーサービス KillMode を「Process」に設定します。
引用:https://stackoverflow.com/questions/32208782/cant-detach-child-process-when-main-process-is-started-from-systemd
問題:サービスが再起動されると、systemdは通常の動作中にWebサーバーによって生成されたプロセスを正しく管理(終了)できないことがあります。これにより、プロセスが制御不能状態になると、システムリソースを回復することが困難になる可能性があります。
考えられる解決策4:一時プロセス制御グループ ala systemd-run を作成します。
引用:https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/resource_management_guide/chap-using_control_groups#sec-Creating_Transient_Cgroups_with_systemd-run
問題:systemd-run --user --scope whoami > /home/appuser/test.txt 2>&1
シェルではなくWebサービス内で実行しようとすると、次のエラーメッセージが表示されます
Failed to connect to bus: $DBUS_SESSION_BUS_ADDRESS and $XDG_RUNTIME_DIR not defined (consider using --machine=<user>@.host --user to connect to bus of other user)
。検索して検索したら、次のことを試しました。
- 環境変数を設定する
export DBUS_SESSION_BUS_ADDRESS='unix:path=/run/user/$UID/bus'
とエラーが発生しますFailed to connect to bus: No such file or directory
。人々はこれを解決するために「通常のログイン/シェル」で実行することについて話しますが、これは通常のユーザーではなくネットワークサービスです。 - 一般的なアドバイスは、「sudo」と「su」を使用しないことです。私には役に立たない。
dbus
パッケージがdbus-user-session
インストールされました。
ご協力ありがとうございます。これが私を狂わせている!