尽管设置了 nohup 和 disown,为什么 bash 在注销后仍向程序发送 SIGTERM

尽管设置了 nohup 和 disown,为什么 bash 在注销后仍向程序发送 SIGTERM

我想运行一个在从 ssh 会话注销后继续运行的程序。

我试过了:

nohup myProg > /tmp/logfile 2>&1 &
disown %1

systemd-run --scope --user myProg -p > /tmp/logfile 2>&1  &

在这两种情况下,进程都会从启动它的 bash 进程接收到一个 SIGTERM。

(程序用于sigaction信号处理,识别发送信号的PID)

struct sigaction sigActionInfo;
sigActionInfo.sa_sigaction = DvsRebuildInfoFiles::signalHandler;
sigActionInfo.sa_flags = SA_SIGINFO;
sigemptyset(&sigActionInfo.sa_mask);
sigaction(SIGINT,  &sigActionInfo, 0);
sigaction(SIGTERM, &sigActionInfo, 0);

DvsRebuildInfoFiles::signalHandler(int sigNo, siginfo_t *sigInfo, void *context)
{
    pid_t sendingPid = sigInfo->si_pid;
    printf("DvsRebuildInfoFiles: Received Signal %d from process %d\n", sigNo, sendingPid);
}

从另一个终端会话查看日志文件可以确认它是bash发送的SIGTERM

# ps -lf
F S UID          PID    PPID  C PRI  NI ADDR SZ WCHAN  STIME TTY          TIME CMD
0 S root      858355  858354  0  80   0 - 59839 -      03:40 pts/0    00:00:00 -bash
0 S root      858530  858355 12  80   0 - 944937 -     03:40 pts/0    00:00:01 ./DvsRebuildInfoFiles -p
0 S root      858906  858530  0  80   0 - 55622 -      03:40 pts/0    00:00:00 sh -c /usr/local/dvstor/bin64/DvGetProgramList /mnt/das.a/202307
0 D root      858907  858906  0  99  19 - 35888 -      03:40 pts/0    00:00:00 /usr/local/dvstor/bin64/DvGetProgramList /mnt/das.a/20230719.085
etc. etc. 

为什么会这样并且可以预防吗?

笔记

  1. 我不知道这是否相关,但程序本身启动许多线程,每个线程依次通过 system().

  2. 重新编码信号处理程序不是一个选项,因为程序必须能够通过信号停止。

  3. /etc/systemd/logind.conf该行已被注释掉吗

  4. 通过 ssh 访问。没有图形用户界面。

相关内容