2016-07-20 4 views
3

나는 간단한 데비안 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으로 유지하고 일부 프로세스를 해당 제어 그룹 밖으로 밀어 낼 수 있습니까?

+0

아니요, 그런 기능이 없습니다. –

+0

@SamVarshavchik, 잘 아 ... 너무 나빴어. 내 서버는 이미 실행중인 것을 추적하고 어쨌든 모든 것을 죽인다.하지만'systemd'에서 한 번만 빠져 나오면 좋을 것이다. (모두 또는 아무것도 아닌 ...) –

+1

물론 프로세스를 얻을 수있다. 귀하의 컨트롤 그룹. 프로세스를 직접 직접 시작하는 대신 'at'또는 'cron'과 같은 도구를 사용하여 시작하십시오. – MSalters

답변

1

systemd-run command을 사용하여 systemd에게 새 제어 그룹 내에서 프로세스를 시작하도록 요청할 수 있습니다.