我想运行一个在从 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 访问。没有图形用户界面。