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

ベストアンサー1

おすすめ記事