특정 설정이 있습니다.
- 프로그램
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
?
답변1
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
이 솔루션은 닫기 버튼을 통해 닫을 시기를 처리하지 않기 때문에 완벽하지는 않지만 원래 문제를 해결합니다.