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를 통해 액세스합니다. 그래픽 사용자 인터페이스가 없습니다.