systemd 如何處理託管程序的子程序死亡?
如何
systemd
處理託管程序的子程序的死亡?假設
systemd
啟動守護程序foo
,然後啟動其他三個守護程序:bar1
、bar2
和bar3
。如果意外終止會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 的終止中看到的
SIGCHLD
和wait()
狀態。程序 A 不知道 C、D 和 E 發生了什麼,這與 systemd 無關。A 要知道 C、D 和 E 終止,必鬚髮生兩件事。
- A 必須將自己註冊為“子收割者”。systemd 會這樣做,其他各種服務管理器(包括 upstart 和 nosh )也是如此
service-manager
。- B 必須
exit()
。那些愚蠢、錯誤和徒勞地試圖將自己“妖魔化”的服務會這樣做。(人們可以在 BSD 上變得聰明
kevent()
。但這是一個 Linux 問題。)