C

KDE 控制台如何處理 SIGTERM?

  • October 22, 2019

我有一個特定的設置:

  • 一個manager程序可以啟動和停止一個程序。

  • 一個wrapper程序由以下部分組成:

    • Konsole.
    • 一個程序worker執行到Konsole.

我的問題是:

manager發送SIGTERM到 時konsolekonsole似乎發送SIGKILL給它的孩子(因為worker似乎沒有截獲任何信號)。

測試

工人程式碼:

#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int last_sig = 0;

void sig_handler(int sig) {
   last_sig = sig;
}

int main(void)
{
   FILE * f = fopen("a.trace", "w");

   signal(SIGTERM, sig_handler);
   signal(SIGKILL, sig_handler);
   signal(SIGQUIT, sig_handler);        

   while(1) {
       if (last_sig) {
           fprintf(f, "got %d\n", last_sig);
           fflush(f);
           last_sig = 0;
       }
       else
           sleep(100); # sleep is interrupted on signal
   }
   fclose(f);
   return 0;
}

測試人員

gcc worker.c 

./a.out &
pkill -15 a.out
sleep 2
pkill -9 a.out

內容a.trace符合預期:

got 15

使用 Konsole 時出現問題

konsole -e ./a.out &

pkill -15 konsole # warning, maybe other konsole processes running    

a.trace是空的,我認為這是因為它收到一個SIGKILL.

  • 我對嗎?
  • 我怎麼知道Konsole要翻譯SIGTERM

一個部分答案是啟動一個小腳本而不是konsole直接啟動:

#!/bin/bash

#SIGTERM handler
on_term () {
   echo "SIGTERM got, sending to worker"
   kill -TERM $WORKERID
}

#intercept SIGTERM
trap _term SIGTERM

# launch console 
konsole --hide-menubar --hide-tabbar --nofork -e worker &

#get Konsole pid
KONSOLEID=$!

# wait for worker to be launched
sleep 1

# get worker pid 
WORKERID=$(pgrep -P $KONSOLEID worker )

echo "worker is running under pid: $WORKERID"

# wait for one child end
wait

echo "worker terminated"

這個解決方案並不完美,因為它不處理Konsole關閉按鈕何時關閉,但它解決了最初的問題。

引用自:https://unix.stackexchange.com/questions/544796