質問
私のC ++アプリケーションはシステムサービスとして実行されます。環境変数を使用して構成し、アプリケーションを再起動しなくても、実行時に変数値を再ロードできる必要があります。
私.confファイルと使用環境その中の値を変更した後、daemon-reloadを実行します。.conf文書。しかし、サービスは変更を認識しませんでした。
私は知っていますsystemctlの再ロードコマンドを実行しましたが、何を設定するのかわかりません。リフレッシュの実行指示する。
C++アプリケーションコード
#include <unistd.h>
#include <fstream>
using namespace std;
int main(int argc, char** argv)
{
while (true)
{
char * cp = getenv("BAR");
string s = "";
if (cp)
s = (string) cp;
fstream fs;
fs.open("/tmp/foo", ios_base::app);
fs << s << endl;
fs.close();
sleep(1);
}
return 0;
}
サービスの説明
パス:/etc/systemd/system/foo.service
[Unit]
Description=Testing configuration reloading
[Service]
ExecStart=/home/user/foo_application
Type=simple
[Install]
WantedBy=default.target
サービス構成ファイル
パス:/etc/systemd/system/foo.service.d/foo.conf
[Service]
Environment="BAR=2"
私の以前の(再)検索
https://serverfault.com/a/590732/379539
https://coreos.com/os/docs/latest/using-environment-variables-in-systemd-units.html
https://www.freedesktop.org/software/systemd/man/systemctl.html
答え1
プロセスが作成されると、環境はプロセスのアドレス空間にコピーされます。環境の変更は新しく開始されたプロセスにのみ影響し、実行中のプログラムの環境は外部から変更できません。
目標を達成するには、プロセス間通信(IPC)メカニズムの種類を必要とするか、ファイルに新しい値を書き、プログラムにファイルの内容をポーリングする必要があります。
答え2
考慮しているサービスを喜んで再起動しない限り(つまり、実行中のプロセスを終了して新しいプロセスを開始する)、動作しません。環境変数はプロセスの個々の属性であり、親プロセスから継承されます。始める(つまり、親プロセスがfork
sの場合)実行中のプロセスの環境変数を変更する方法はありません(プロセスメモリを直接操作するなどのハッキングは計算されません/proc/pid/mem
)。したがって、プロセスを起動してSIGUSR1
設定を再度読み取っても(多くのサービスとデーモンが実装されている)、それは役に立ちません。プロセスは、以前とまったく同じ環境変数を探します。
必要な動作については、ファイルから設定パラメータを取得することを検討してください。