我有一个特殊的设置:
manager程序可以启动和停止一个程序。wrapper程序,由:组成Konsole。worker运行在Konsole中。我的问题是:
当manager将SIGTERM发送到konsole时,konsole似乎将SIGKILL发送给其子节点(因为worker似乎没有截获任何信号)。
工人代码:
#include
#include
#include
#include
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.outa.trace的内容与预期的一样:
got 15时出现
konsole -e ./a.out &
pkill -15 konsole # warning, maybe other konsole processes running a.trace是空的,我认为是因为它接收到了一个SIGKILL。
Konsole翻译SIGTERM?发布于 2019-10-04 10:17:32
一个部分的答案是直接启动一个小脚本而不是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
复制相似问题