特定の設定があります。
- プログラム
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
このソリューションは、閉じるボタンを介して閉じる時期を処理しないため、完璧ではありませんが、元の問題を解決します。