Я разрабатываю приложение Ruby on Rails. Частью функциональности является запуск и закрытие соединения с ведомым устройством Modbus через последовательный порт, получение данных и их сохранение в базе данных. Также я сделал скрипт на питоне, который делает именно то, что мне нужно, поэтому я не хочу изобретать велосипед и переписывать его на Ruby.
Моя идея состоит в том, чтобы запустить процесс, который будет выполнять скрипт Python и убивать процесс, когда он больше не нужен.
Я запускаю процесс следующим образом, поэтому я могу получить доступ к его pid:
def start
...
@@pids[ object.id ] = IO.popen("python ./python_script_name.py").pid
...
@@pids — это хэш, в котором хранятся pid всех запущенных процессов с ключом в качестве object.id (предполагается, что каждый объект может запускать только один процесс)
Когда я хочу закрыть соединение, я убиваю процесс, например:
def stop
...
pid = @@pids[ object.id ]
system("kill #{pid}")
Это приводит к зомби-процессу (виден после ps aux | grep python
):
[python] <defunct>
Я попытался отправить сигнал SIGCHLD
в приложение rails (поскольку он является родителем ранее называемого скрипта python), но он не работает.
Я хочу добавить, что мне может понадобиться вызывать/убивать этот процесс довольно часто, поэтому это может привести к огромному количеству процессов-зомби.
Как я могу убить процесс, не оставив зомби-процесс?
SIGKILL
, иSIGTERM
- результат тот же. - person Piotr Pawlik   schedule 24.04.2015Hash#fetch
вместоHash#[]
? Кажется, что с этим объектом может быть достаточно легко запутаться, особенно учитывая перезагрузку разработчика Rails (идентификаторы объектов могут измениться ) Пробовали ли вы создать какой-то другой процесс, который вы контролируете и можете видеть, чтобы увидеть, получает ли он сигнал?(т.е. перехватить его и записать в файл, а затем передать исходному обработчику). - person Joshua Cheek   schedule 27.04.2015signal
в скрипте Python как дляSIGKILL
, так и дляSIGTERM
. Они работают (сигнал ловится нормально), но зомби-процесс остается позади. Я использовалsys.exit()
,sys.quit()
, дажеraise SystemExit
- все с тем же результатом. Может быть, есть какой-то другой способ завершить скрипт и сообщить родительскому процессу (в данном случае серверу rails), что он завершен правильно? - person Piotr Pawlik   schedule 27.04.2015