別のプロセスが systemd にサービスを再起動するように信号を送ることはできますか?

別のプロセスが systemd にサービスを再起動するように信号を送ることはできますか?

によって管理されているサービスがありますsystemd。シグナルの送信、ファイルへの書き込み、ソケット経由のメッセージ送信などにより、オンデマンドでプログラム的にサービスを再起動する方法を探しています。

コンテキスト:systemdマネージド サービスは、ヘッドレス Chrome インスタンスのプールを維持します。ただし、それらの管理があまり良くなく、時間の経過とともにインスタンスの数とメモリ使用量が増加します。A はsystemctl restartこれを修正します。

RuntimeMaxSecプロキシを定期的に再起動するように設定することはできますRestart=alwaysが、再起動が発生した瞬間にプロキシが動作している可能性があります。

そのマシン上の別のサービスは Chrome プロキシの唯一の消費者であり、Chrome プロキシを使用していないことを認識しています。そのため、Chrome プロキシを使用していないときは定期的に (リクエストがドロップされないように)、Chrome プロキシを再起動できます。

どうすればそれができるでしょうか?

答え1

1 つの解決策は、他のサービスを実際に実行することですsystemctl restart some_service。これには が必要ですが、ファイル ( ) を使用して、ユーザーに特定のコマンドを実行する権限を与えるsudoことができます。sudoersvisudosome-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 ともうまく連携します。

関連情報