C
KDE 控制台如何處理 SIGTERM?
我有一個特定的設置:
一個
manager
程序可以啟動和停止一個程序。一個
wrapper
程序由以下部分組成:
Konsole
.- 一個程序
worker
執行到Konsole
.我的問題是:
當
manager
發送SIGTERM
到 時konsole
,konsole
似乎發送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
關閉按鈕何時關閉,但它解決了最初的問題。