Создание независимого потока или процесса в Ruby - PullRequest
6 голосов
/ 08 апреля 2011

Возможно, я подхожу к этому в неправильном направлении, поэтому любая помощь будет принята.

У меня есть скрипт на Ruby, который, помимо прочего, запускает исполняемый файл.Я хочу запустить этот исполняемый файл - в настоящее время запускается с помощью системы "" - и затем продолжить со сценарием.Когда скрипт завершится, я хочу, чтобы он вышел, но оставил исполняемый файл запущенным.

Первоначально у меня было следующее

# Do some work
# Start the executable
system("executable_to_run.exe")

# Continue working

Но исполняемый файл_to_run.exe является блокирующим исполняемым файлом, и система "" не завершит работу, пока исполняемый файл не завершит работу (чего я не хочу)

Так что теперь у меня есть что-то вроде этого (резко сокращено)

# Do some work
# Start the executable on it's one thread
Thread.new do
  system("executable_to_run.exe")
end

# Continue working

Это хорошо работает, поскольку мой сценарий может продолжать работать, пока поток запускает исполняемый файл в фоновом режиме.К сожалению, когда мой сценарий завершает работу, исполняемый поток все еще работает и не завершится, пока поток не сможет выйти.Если я убиваю исполняемый файл, поток завершается и сценарий завершается.

Поэтому мне нужно вызвать триггер «executetable_to_run.exe» и просто оставить его работающим в фоновом режиме.

Яиспользование Ruby 1.8.7 в Windows, что означает, что fork не реализован.Я не могу обновиться до 1.9, так как есть внутренние и внешние командные зависимости, которые мне нужно сначала разрешить (и которые не будут сделаны в ближайшее время).

Я пробовал

  • Запуск процесса с помощью команды 'start', но он по-прежнему блокирует
  • Вызов Thread.kill в исполняемом потоке, но он все еще требует уничтожения исполняемого файла

Так что же это такое?Я могу сделать в Ruby, и я что-то упускаю, или у меня проблема, потому что я не могу использовать Fork?

Заранее спасибо

Ответы [ 2 ]

4 голосов
/ 08 апреля 2011

ответ detunized должен работать на окнах.Это кроссплатформенный:

pid = spawn 'some_executable'
Process.detach(pid) #tell the OS we're not interested in the exit status
3 голосов
/ 08 апреля 2011

Я только что попробовал и start не блокируется на Windows 7 x64 с Ruby 1.8.7.

system 'start notepad'
puts 'Exiting now...'

Это явно для Windows.

...