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経由でアクセスします。グラフィカルユーザーインターフェースはありません。