2017-01-13 5 views
-1

Есть ли безопасный и простой способ выполнения подпроцесса, не позволяя ему иметь доступ к дескрипторам файлов родителей? В частности, в моем случае это происходит:Предотвращение подпроцесса от наследования файловых дескрипторов

  1. Родительский процесс прослушивает гнездо 127.0.0.1:8000.

  2. Родительский процесс использует exec для запуска подпроцесса. Этот подпроцесс вилки и запускает демона.

  3. Родительский процесс закрывается.

Демон теперь держит дескриптор файла открытым (продолжает слушать порт 8000).

Возможно, существует некоторая команда, которая может закрыть все дескрипторы файлов перед выполнением подпроцесса?

Эта проблема возникает, например, если вы вызываете команды «обслуживание someservice start» из сценария веб-сервера.

Возможно, есть некоторые команды, которые могли бы запустить сценарий службы в «чистом» контексте, что-то вроде:

run-detached service someservice start 

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

+2

[[FD_CLOEXEC'] (http://man7.org/linux/man-pages/man2/fcntl.2.html) – Patrick

+0

[Вы не первый человек, чтобы сделать это] (http: // jdebp .ru./Программное обеспечение/nosh/bsd-service-command.html # Наследование), но правильный подход заключается в том, чтобы не запускать dæmons таким образом, в первую очередь, и использовать реальное управление услугами, а не искать способы привязки дочерних процессов , – JdeBP

+0

Это зависит от программы, которая 'fork()' s закрывает ненужные дескрипторы файлов (или маркирует их как close-on-exec) перед 'exec()' в новую программу. Это не то, что вы можете навязать снаружи как системный администратор. (Для консультаций по аспектам программирования вы можете захотеть перейти к [так]). –

ответ

0

Вы не можете закрыть дескрипторы файлов извне процесса (по очевидным причинам).

Одна вещь, которую вы могли бы сделать, это создать небольшую прокладку для программы, которая должна быть запущена в подпроцессе, и убедить родителя в том, что вместо этого (например, положив его вместо оригинала) вместо exec(). Эта небольшая программа может затем закрыть дескрипторы файлов, а затем выполнить оригинальную программу.

+0

Я надеюсь, что есть стандартная команда Linux, которая может использовать fork, тогда вилка закрывает FDs, кроме std *, и запускает процесс, а затем родитель ждет завершения вилки перед возвратом в основную программу. Это должен быть общий сценарий. – frodeborli