
によって管理されているサービスがありますsystemd
。シグナルの送信、ファイルへの書き込み、ソケット経由のメッセージ送信などにより、オンデマンドでプログラム的にサービスを再起動する方法を探しています。
コンテキスト:systemd
マネージド サービスは、ヘッドレス Chrome インスタンスのプールを維持します。ただし、それらの管理があまり良くなく、時間の経過とともにインスタンスの数とメモリ使用量が増加します。A はsystemctl restart
これを修正します。
RuntimeMaxSec
プロキシを定期的に再起動するように設定することはできますRestart=always
が、再起動が発生した瞬間にプロキシが動作している可能性があります。
そのマシン上の別のサービスは Chrome プロキシの唯一の消費者であり、Chrome プロキシを使用していないことを認識しています。そのため、Chrome プロキシを使用していないときは定期的に (リクエストがドロップされないように)、Chrome プロキシを再起動できます。
どうすればそれができるでしょうか?
答え1
1 つの解決策は、他のサービスを実際に実行することですsystemctl restart some_service
。これには が必要ですが、ファイル ( ) を使用して、ユーザーに特定のコマンドを実行する権限を与えるsudo
ことができます。sudoers
visudo
some-user ALL=NOPASSWD: /some/command some args
答え2
sudo を回避したい場合は、ユーザーの linger フラグを設定し、システム サービスの代わりにユーザー サービスを作成できます。これは CentOS 7 以下では機能しない可能性があります。
もう一つの解決策は、systemctlにPIDを尋ねることです。
systemctl --user status your_scraper
そのプロセスIDにSIGHUPを送信します
os.kill(main_pid_of_your_scraper, signals.SIGHUP)
これをアプリケーション内でキャッチし、ブラウザをリセットする必要があります。
signal.signal(signal.SIGHUP, restart_myself)
systemctl reload
これは、プロセスに SIGHUP シグナルも送信するため、systemcl ともうまく連携します。