Linux

systemd 如何處理託管程序的子程序死亡?

  • September 28, 2016

如何systemd處理託管程序的子程序的死亡?

假設systemd啟動守護程序foo,然後啟動其他三個守護程序:bar1bar2bar3。如果意外終止會systemd做什麼?據我了解,如果您沒有通過更改屬性來告知其他情況,則Solaris 上的 Service Management Facility (SMF)將被終止或重新啟動。行為是否不同?foo``bar2``foo``startd``ignore_error``systemd

編輯#1:

我編寫了一個測試守護程序來測試systemd的行為。呼叫守護程序是mother_daemon因為它產生子程序。

#include <iostream>
#include <unistd.h>
#include <string>
#include <cstring>

using namespace std;

int main(int argc, char* argv[])
{
 cout << "Hi! I'm going to fork and make 5 child processes!" << endl;

 for (int i = 0; i < 5; i++)
   {
   pid_t pid = fork();

   if (pid > 0)
     {
   cout << "I'm the parent process, and i = " << i << endl;
     }
   if (pid == 0)
     {
     // The following four lines rename the process to make it easier to keep track of with ps
   int argv0size = strlen(argv[0]);
   string childThreadName = "mother_daemon child thread PID: ";
   childThreadName.append( to_string(::getpid()) );
   strncpy(argv[0],childThreadName.c_str(),argv0size + 25);

   cout << "I'm a child process, and i = " << i << endl;
   pause();
   // I don't want each child process spawning its own process
   break;
     }
   }
 pause();
 return 0;
 }

這是由一個systemd名為的單元控制的mother_daemon.service

[Unit]
Description=Testing how systemd handles the death of the children of a managed process
StopWhenUnneeded=true

[Service]
ExecStart=/home/my_user/test_program/mother_daemon
Restart=always

mother_daemon.service裝置由mother_daemon.target

[Unit]
Description=A target that wants mother_daemon.service
Wants=mother_daemon.service

當我執行sudo systemctl start mother_daemon.target(之後sudo systemctl daemon-reload)時,我可以看到父守護程序和五個子守護程序。

殺死其中一個孩子對父母沒有影響,但殺死父母(並因此觸發重新啟動)確實會重新啟動孩子。

停止也mother_daemon.target結束sudo systemctl stop mother_daemon.target了孩子們。

我認為這回答了我的問題。

它沒有。

主程序以正常方式處理其子程序的死亡。

這就是 POSIX 世界。如果程序 A 分叉了 B,程序 B 分叉了 C、D 和 E;那麼程序 B 是從 C、D 和 E 的終止中看到的SIGCHLDwait()狀態。程序 A 不知道 C、D 和 E 發生了什麼,這與 systemd 無關。

A 要知道 C、D 和 E 終止,必鬚髮生兩件事。

(人們可以在 BSD 上變得聰明kevent()。但這是一個 Linux 問題。)

引用自:https://unix.stackexchange.com/questions/312491