sigint не распространяется на фоновый дочерний процесс

Мне нужно отправить SIGINT, чтобы закончить процесс изящно, но я не могу.

Это образец, потому что среда, в которой выполняется выполнение, является «неизвестным» (сценарий bash на travis.com)

Мне удалось получить (имитировать) такое же поведение, запустив такой процесс (command &) &

 vagrant@host:~$ (sleep 40 &) & [1] 8473 vagrant@host:~$ ps -o pid,pgid,args PID PGID COMMAND 2787 2787 -bash 8474 8473 sleep 40 8490 8490 ps -o pid,pgid,args [1]+ Done ( sleep 40 & ) vagrant@host:~$ kill -INT 8474 ##### here I send SIGINT to the process vagrant@host:~$ kill -INT -8473 ##### here I send SIGINT to the process group vagrant@host:~$ ps -o pid,pgid,args PID PGID COMMAND 2787 2787 -bash 8474 8473 sleep 40 8559 8559 ps -o pid,pgid,args 

Я много гулял и много читал о сигналах и группах, и я не могу понять, что здесь происходит. В какой-то момент игнорируется сигнал? Что происходит? Как отправить SIGINT в этот «сон»?

EDIT : если используется SIGTERM, процесс уничтожается (возможно, родительская подоболочка убита?)

One Solution collect form web for “sigint не распространяется на фоновый дочерний процесс”

Чтобы неинтерактивная работа отвечала на SIGINT, вам нужно создать обработчик для SIGINT:

 $ ( (trap "echo Got SigInt" SIGINT; sleep 60) & ) & [1] 13619 $ [1]+ Done ( ( trap "echo Got SigInt" SIGINT; sleep 60 ) & ) $ ps -o pid,pgid,args PID PGID COMMAND 11972 11972 bash 13620 13619 bash 13621 13619 sleep 60 13622 13622 ps -o pid,pgid,args $ kill -INT 13620 $ kill -INT 13621 $ Got SigInt 

Отправка SIGINT в режим сна

Как предлагает Stéphane Chazelas в комментариях, если целью является возвращение к поведению SIGINT по умолчанию, мы можем просто использовать trap - SIGINT . Например:

 $ ( (trap - SIGINT; sleep 60) & ) & [1] 16690 $ ps -o pid,pgid,args PID PGID COMMAND 11972 11972 bash 16691 16690 bash 16692 16690 sleep 60 16693 16693 ps -o pid,pgid,args [1]+ Done ( ( trap - SIGINT; sleep 60 ) & ) $ kill -INT 16692 $ ps -o pid,pgid,args PID PGID COMMAND 11972 11972 bash 16698 16698 ps -o pid,pgid,args 
  • Почему мы используем kill -9 всегда
  • Сжимает ли ctrl-c несколько раз быстрее запускает запущенную программу?
  • Запустите HTTP-сервер python, который может быть остановлен кем-либо еще
  • Когда вы пытаетесь прекратить процесс навсегда, какой вариант «убить» следует использовать?
  • CentOS Запуск процесса не реагирует на сигналы kill, а не переключается по контексту
  • Почему Ctrl-C ведет себя иначе, чем kill -2
  • Linux и Unix - лучшая ОС в мире.