LINUX.ORG.RU

Наследование сокетов процессами


0

1

Здравствуйте знающие люди. Есть некий демон, слушающий порт 33901. Задача - по команде демон должен обновится , и перезапуститься. Для этого он запускает некий update.sh, далее этот update.sh выполняет

service daemon stop

# update ...

service daemon start

Но есть одна проблема - сокет, который слушал демон остается за этим самым update.sh. Т.е. до запуска update.sh было

netstat -nap | grep LISTEN:

tcp 0 0 0.0.0.0:33901 0.0.0.0:* LISTEN 8446/daemon

после:

tcp 0 0 0.0.0.0:33901 0.0.0.0:* LISTEN 8500/bash

как вариант был - длбавлять задание через atd, даже работало, но задержка в минуту неприемлима. Каким же образом запускать update.sh чтобы он не хватал сокет родительского процесса?



Последнее исправление: noneim (всего исправлений: 1)

чтобы он не хватал сокет родительского процесса?

Указать O_CLOEXEC для open, SOCK_CLOEXEC для socket или FD_CLOEXEC для fcntl не подойдет?

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

SOCK_CLOEXEC не помогает почему то.... Вообщем вопрос такой - как указать главному процессу (init вроде бы..) чтобы он запустил такой то сервис/программу немедленно, причем всякие открытые сокеты/дескрипторы бы не наследовались...

noneim
() автор топика

вообщем нашел 2 варианта решения:

1) ./program 13>&-

2) #include <unistd.h> void closeall() { long max = sysconf(_SC_OPEN_MAX);

while (--max >= 0) close(max); }

второе лучше, т.к. закрывает сразу всё ненужное, но аналогов на скриптовых языках пока почему то не нашел

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