Уничтожение оболочек, когда поток умирает - PullRequest
3 голосов
/ 29 октября 2019

У меня есть такой код:

#! /usr/bin/env ruby

Thread.report_on_exception=false
Thread.abort_on_exception=true

Thread.new do
  `shellcommand 1 2 3`
end

do_other_stuff

Если do_other_stuff встречает исключение, это убивает поток и весь процесс ruby, что я и хочу. Но shellcommand 1 2 3 продолжает работать в фоновом режиме.

Как можно также убить shellcommand 1 2 3 при прекращении процесса ruby?

1 Ответ

1 голос
/ 29 октября 2019

Вы не можете (хотя бы с общим флагом на Thread). Это отдельный процесс, который вы начали в потоке. Умирающий поток не останавливает процесс.

Вы должны сохранить pid процесса и явно прекратить его:

Thread.report_on_exception = false
Thread.abort_on_exception = true

pids = []

at_exit do
  pids.each do |pid|
    `kill -9 #{pid}`
  end
end

Thread.new do
  pids.push Process.spawn('for((i=0; ;++i)); do echo "$i"; sleep 1; done')
end

sleep 5
raise 'Failure'

Вывод:

0
1
2
3
4
Traceback (most recent call last):
test.rb:17:in `<main>': Failure (RuntimeError)

Само собой разумеется, не используйте этот код как в производстве.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...