질문
내 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
구성을 다시 읽게 해도(많은 서비스와 데몬이 구현됨) 도움이 되지 않습니다. 프로세스는 이전과 정확히 동일한 환경 변수를 찾습니다.
귀하가 요구하는 동작에 대해서는 파일에서 구성 매개변수를 가져오는 것을 고려해 보는 것이 좋습니다.