Свяжите жизнь процесса с оболочкой, которая его начала - PullRequest
8 голосов
/ 04 декабря 2009

В UNIX-y я пытаюсь запустить процесс, установить его фон и связать время жизни этого процесса с моей оболочкой.

То, о чем я говорю, это не просто фон процесса, я хочу, чтобы процесс был отправлен SIGTERM, или чтобы у него был открытый дескриптор файла, который закрыт, или что-то когда оболочка завершает работу, чтобы пользователю оболочки не приходилось явно завершать процесс или получать предупреждение «у вас запущены задания».

В конечном итоге мне нужна программа, которая может уникальным образом запускаться для каждой оболочки и переносить состояние вместе с этой оболочкой и закрываться при закрытии оболочки.

Консольные команды IBM DB2 работают таким образом. Когда вы подключаетесь к базе данных, она порождает процесс "db2bp", который переносит состояние базы данных и соединение и связывает его с вашей оболочкой. Вы можете подключиться к нескольким различным терминалам или ssh-соединениям, каждое со своим собственным процессом db2bp, и когда они закрыты, соответствующий процесс db2bp умирает и это соединение закрывается.

Запросы DB2 затем запускаются командой db2, которая просто передает ее соответствующему процессу db2bp. Я не знаю, как он взаимодействует с правильным db2bp процессом, но, возможно, он использует устройство tty, подключенное к stdin, в качестве уникального ключа? Думаю, мне тоже нужно это выяснить.

Я никогда не писал ничего, что бы манипулировало tty, поэтому я понятия не имею, с чего начать. Я думаю, что смогу понять остальное, если я смогу просто запустить процесс, который автоматически убивается при выходе из оболочки. Кто-нибудь знает, как это делает DB2?

Ответы [ 4 ]

2 голосов
/ 04 декабря 2009

Если ваша оболочка не является подоболочкой, вы можете сделать следующее; Поместите следующее в скрипт под названием "ttywatch":

#!/usr/bin/perl
my $p=open(PI, "-|") || exec @ARGV; sleep 5 while(-t); kill 15,$p;

Затем запустите вашу программу как:

$ ttywatch commandline... & disown

Отказ от процесса предотвратит появление в оболочке жалобы на то, что запущены процессы, и когда терминал закроется, это приведет к доставке SIGTERM (15) в подпроцесс (ваше приложение) в течение 5 секунд.

Если оболочка не является подоболочкой, вы можете использовать такую ​​программу, как ttywrap , чтобы хотя бы присвоить ей собственный tty, и тогда вышеуказанный трюк сработает.

2 голосов
/ 04 декабря 2009

Хорошо, думаю, я понял это. Я делал это слишком сложно:)

Я думаю, что все db2 - это демон db2bp, затем db2bp вызывает waitpid для родительского PID (PID оболочки) и завершает работу после возврата waitpid.

Связь между командой db2 и db2bp, по-видимому, осуществляется через fifo с именем файла, основанным на PID родительской оболочки.

Вааааа, проще, чем я думал :) 1007 *

Для всех, кому интересно, вся эта попытка состояла в том, чтобы связать интерактивный сеанс python или groovy с оболочкой, чтобы я мог тестировать код, легко выполняя вход и выход из сеанса, который сохранял бы соединения с базой данных и временные классы / переменные.

Спасибо всем за помощь!

0 голосов
/ 04 декабря 2009

Возможно ли, что ваша настоящая проблема здесь - это оболочка, а не ваш процесс. Насколько я понимаю, я согласен с Джимом Льюисом в том, что, когда оболочка умирает, ее дети должны получить SIGHUP. Но вы жалуетесь на то, что оболочка (или, возможно, терминал) пытается предотвратить случайное уничтожение работающей оболочки с активными дочерними элементами.

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

Из руководства по bash на моем MacBook:

По умолчанию оболочка завершается при получении SIGHUP. Перед выходом интерактивная оболочка отправляет SIGHUP на все рабочие места, работает или остановлен. Остановленные задания отправляются SIGCONT, чтобы гарантировать получение SIGHUP. к чтобы оболочка не отправляла сигнал на конкретное задание, его следует удалить из таблицы заданий с помощью встроенная команда disown (см. ниже команды SHELL BUILTIN) или помеченная как не получающая SIGHUP с использованием команды disown -h.

Если параметр оболочки huponexit был установлен с помощью shopt, bash отправляет SIGHUP всем работам, когда интерактивный выход из оболочки входа в систему.

, который может указать вам правильное направление.

0 голосов
/ 04 декабря 2009

Ваша оболочка должна отправлять сигнал SIGHUP всем работающим дочерним процессам, когда она выключается. Вы пытались добавить обработчик SIGHUP в свое приложение, чтобы закрыть его когда оболочка выходит?

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