나는 간단한 데비안 upgrade 명령을 실행하여 서버 내에서 업그레이드를 할 것을 시도하고있다 업그레이드에 서버의 새 버전이 포함 된 경우 업그레이드가 실패합니다. 보다 정확하게는 dpkg가 preinst
스크립트를 실행할 때마다 앞에서 설명한 명령을 실행하는 프로세스가 systemctl stop server
이므로 실행되지 않습니다.Systemctl이 내 자식 프로세스 중 하나를 중단시키지 않도록하는 방법은 무엇입니까? (즉, 내가 <strong>서버</strong> 및 부품의라는 이름의 패키지가 말하는 그 업그레이드가 자신을 포함하는 경우, 그러나</p> <pre><code>sudo apt-get upgrade </code></pre> <p>:
코드는 다음과 같은 것을 수행합니다
이// start with systemd
systemctl start server
// the server runs another daemon which manages the computer packages
// this is C++ code within server doing something like:
if(fork() == 0)
{
execv("package_manager", ...);
}
// if I look at the output of systemctl status server, I see:
systemctl status server
CGroup: server
+-- package_manager
// then package_manager decides to do an upgrade, it starts a process
system("do_server_upgrade");
// in the do_server_upgrade code, I use fork() again to leave the
// existing set of daemons (server and package_manager)
int main()
{
if(fork() != 0)
{
return 0;
}
setsid();
signal(SIGHUP, SIG_IGN);
...run the commands to apply the upgrades...
}
이 this stackoverflow answer, 당으로 나는 systemd가 (SIGTERM을 보내) 모든 아이 같은 control-group
에서 처리 죽일 것을 배웠다.
그래서 저는 서버가 실행하는 다른 모든 데몬을위한 깔끔한 기능이라고 생각했습니다. 단 하나만 제외하면 do_server_upgrade
입니다. 다른 말로하면 (즉, KillMode=control-group
) 그대로 유지하는 것이 좋지만 해당 컨트롤 그룹에서 하위 프로세스를 가져 오는 방법이없는 것처럼 보입니다.
내 질문은 다음과 같습니다. 누군가 이러한 기능에 대해 알고 있습니까? 내 서비스를 control-group
으로 유지하고 일부 프로세스를 해당 제어 그룹 밖으로 밀어 낼 수 있습니까?
아니요, 그런 기능이 없습니다. –
@SamVarshavchik, 잘 아 ... 너무 나빴어. 내 서버는 이미 실행중인 것을 추적하고 어쨌든 모든 것을 죽인다.하지만'systemd'에서 한 번만 빠져 나오면 좋을 것이다. (모두 또는 아무것도 아닌 ...) –
물론 프로세스를 얻을 수있다. 귀하의 컨트롤 그룹. 프로세스를 직접 직접 시작하는 대신 'at'또는 'cron'과 같은 도구를 사용하여 시작하십시오. – MSalters