2013-04-30 2 views
2

Я планирую управлять некоторыми программами (например, медиаплеером и оболочкой) через webapp, , так как веб-страница умирает каждый раз, когда пользователь посещает ее, я решил, что webapp откроет программу с setsid, а затем webapp свяжется с ней через трубы.Как получить идентификатор процесса, выполняемого через setid

Примечание: я не могу использовать nohup, потому что что-то вроде nohup bash -i <fifoin >fifoout 2>&1 & автоматически останавливается.

С setsid все работает отлично, но я не могу убить процесс, так как я не знаю идентификатор разветвленного процесса! .. Так как я могу получить идентификатор процесса setsid?

Я пытался что-то вроде

setsid bash -i <fifoin >fifoout 2>&1 
kill $! 
kill $$ 

В результате оба kill не работают, я не буду искать идентификатор с ps -e becouse я не могу убить все работает bash -i оболочки!

ответ

1

только несколько запутанных методы, использующие strace приходят на ум.

Если вы можете обойтись без перенаправления стандартной ошибки:

read _ _ sid < <(2>&1 strace -esetsid setsid bash -i <fifoin >fifoout) 
echo $sid 

Если вам необходимо перенаправить стандартную ошибку:

strace -o/tmp/filename -esetsid setsid bash -i <fifoin >fifoout 2>&1 & 
sleep 1 # Hope 1 s is long enough 
read _ _ sid </tmp/filename 
echo $sid 
0

Вам все равно необходимо выполнить фоновый процесс с помощью &, иначе он будет запущен на переднем плане, блокируя следующие строки даже от попытки выполнить.

setsid bash -i <fifoin >fifoout 2>&1 & 
kill $! 
+1

На самом деле, это происходит со мной, что 'setsid' не блокирует оболочки. Однако также использование '&' не выполняет задание, infact Если я сначала выполнил 'setsid sleep 50 &', а затем 'kill $!' Возвращает 'bash: kill: (21724) - Нет такого процесса' –

Смежные вопросы