ruby: изпълнение на команда от разклонен дъщерен процес

Имам следния кодов фрагмент:

job1 = fork do
    ret = `some_bash_script_running_python_fabric_task`
end

Process.detach(job1)

Този код е насочен към демонизиране на процес, така че родителят излиза, докато детето продължава да работи във фонов режим.

В резултат получавам изключение на python, посочващо termios.error: (5, 'Input/output error').

Разбрах, че избягването на родителския процес за излизане коригира ситуацията, като това:

job1 = fork do
    ret = `some_bash_script_running_python_fabric_task`
end

sleep 30

Някой може да помогне? Благодаря предварително


person Luca    schedule 26.05.2015    source източник
comment
ОПЕРАЦИОННА СИСТЕМА? Изпълних пример със скрипт sleep 10 ; ls в конзолата на Linux без никакъв проблем.   -  person Aleksei Matiushkin    schedule 26.05.2015
comment
ОС е линукс. скриптът всъщност е скрипт, който изпълнява ssh команда на отдалечена машина   -  person Luca    schedule 27.05.2015


Отговори (1)


Оказа се, че е въпрос на пренасочване на stdin от родителски към дъщерен процес.

Виж отдолу:

Обратните тикчета на Perl/системата дава tcsetattr: грешка при въвеждане/извеждане

Достъп до STDIN на дъщерен процес без прихващане на STDOUT или STDERR

Това е решението:

read_io, write_io = IO.pipe
job1 = fork do
    write_io.close
    STDIN.reopen(read_io)

    puts `fab example`
end

Process.detach(job1)
read_io.close
write_io.close
person Luca    schedule 27.05.2015