LINUX.ORG.RU

Запуск независимого процесса

 


1

2

Ваяю на коленке программу, которая по определенным событиям должна запускать различные приложения. Это могут быть как простенькие скрипты, так и GUI-приложения. Причем хочу добиться того, чтобы запускаемые приложения и скрипты продолжали работать и после смерти (неважно от чего) «родительской» программы. Подскажите куда копать.

Ответ на: комментарий от arturpub

А от чего помирают дочерние процессы?

Они помирают от того, что являются дочерними. Мне же нужно, чтобы они были независимы.

Программа консольная?

Да, консольная. В конечном итоге демоном, думаю, будет.

kernelpanic ★★★★★
() автор топика
Ответ на: комментарий от kernelpanic

Они помирают от того, что являются дочерними.

Что конкретно ты делаешь, блин? Можно закрыть терминал, можно снять родителя по с-с, например.

arturpub ★★
()
Ответ на: комментарий от kernelpanic

fork, fork, exit - всё, отвязались от родителя, дальше процесс живет сам по себе.

gh0stwizard ★★★★★
()
Ответ на: комментарий от kernelpanic

А в чем собственно проблема? Установи переменные окружения, необходимые для их запуска (DISPLAY, etc), потом два раза fork и exec. Ну и еще chuid сделать если главный процесс из-под рута работает.

provaton ★★★★★
()
Ответ на: комментарий от arturpub

Ctrl+C, SIGTERM, SIGKILL, exception, ...

Да неважно от чего умрет "родительская" софтина. Надо чтобы запущенные ею приложения продолжали жить.

kernelpanic ★★★★★
() автор топика
Ответ на: комментарий от provaton

Я сегодня забыл принять таблетки и похоже туплю. Сформулирую вопрос иначе: как из питонового скрипта с бесконечным циклом запустить из этого цикла по определенному событию firefox таким образом, чтобы в случае завершения скрипта firefox продолжал жить?

kernelpanic ★★★★★
() автор топика
Ответ на: комментарий от kernelpanic

Дело в том, что кирдык приходит не от родителя, а от терминала. Увидев С-с, терминал посылает SIGINT to foreground process group, в которой они все участвуют. Чтобы расово верно отделиться от терминала, нужно два раза форкнуться, закрыть стандартные дескрипторы, а также сделать setsid(), ну и потом exec(). Как это выглядит на питоне — без понятия.

arturpub ★★
()

Копай азы unix execution environment, пять звёзд, ёпть.

anonymous
()
Ответ на: комментарий от kernelpanic

Ну как-то так.

import os
import time

def launch_deadbeef():
    pid = os.fork()
    if pid == 0:
        newpid = os.fork()
        if newpid:
            os._exit(0)
        else:
            os.execv('/usr/bin/deadbeef', ['deadbeef'])

cur = 0
while cur < 500:
    cur += 1
    if cur == 20:
        launch_deadbeef()
    time.sleep(0.1)

deadbeef становится чайлдом инита.

provaton ★★★★★
()

xdg-open для гуев, system для консольщины.

Jetty ★★★★★
()

да, и пишется не на сраном питоне, а на тупацком шеле

Jetty ★★★★★
()

и не «пишется», а шкрябается «на коленке» за пол часа.... ну или за час если нужна поддержка нотификаций о действиях (выскакивающих как хинт из панели)...

Jetty ★★★★★
()
Ответ на: комментарий от provaton

Однако заметил одну неприятность. Запускаемые таким образом программы действительно становятся чайлдами инита, но у питоноскрипта появляются дочерние зомбяки с именем python.

kernelpanic ★★★★★
() автор топика
Ответ на: комментарий от kernelpanic

А чтобы такого не было, надо повесить os.wait() на SIGCHLD.

kernelpanic ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.