![尽管设置了 nohup 和 disown,为什么 bash 在注销后仍向程序发送 SIGTERM](https://linux22.com/image/222595/%E5%B0%BD%E7%AE%A1%E8%AE%BE%E7%BD%AE%E4%BA%86%20nohup%20%E5%92%8C%20disown%EF%BC%8C%E4%B8%BA%E4%BB%80%E4%B9%88%20bash%20%E5%9C%A8%E6%B3%A8%E9%94%80%E5%90%8E%E4%BB%8D%E5%90%91%E7%A8%8B%E5%BA%8F%E5%8F%91%E9%80%81%20SIGTERM.png)
我想运行一个在从 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.
为什么会这样并且可以预防吗?
笔记
我不知道这是否相关,但程序本身启动许多线程,每个线程依次通过
system()
.重新编码信号处理程序不是一个选项,因为程序必须能够通过信号停止。
/etc/systemd/logind.conf
该行已被注释掉吗通过 ssh 访问。没有图形用户界面。