从bash启动进程而不继承文件描述符

jak*_*etr 2 linux bash shell

我想从我的bash脚本开始一个新进程,它不会继承父文件描述符.我无法改变这些文件描述符的创建方式.

使用案例: 应用程序中的错误 - >错误挂钩 - >终止进程并重新启动它

对于没有继承父文件描述符的 Windows 启动,有一个类似的主题,但它不适用于Linux.

这在壳中是否可能?

谢谢

UPDATE

我知道我可以自己关闭这些描述符我只是想确保不能用一些魔术选项启动子进程来跳过文件描述符的复制.(因为这个选项对我来说听起来很合理)

cev*_*ing 5

通常不可能阻止文件描述符继承.在C语言中,你可以使用FD_CLOEXEC但即使是仅作为解释的部分解决方案在这里.

关闭那些你不需要的文件描述符:

exec 3>&- #close fd 3.
Run Code Online (Sandbox Code Playgroud)

更长的例子:

#! /bin/bash

# Open some file descriptors
for n in $(seq 10 20) ; do
    eval "exec $n>/dev/null"
done

# List them
echo -n "$BASHPID: " ; ls -v /proc/$BASHPID/fd

# Start a sub process without them
(
    # List inherited descriptors
    echo -n "$BASHPID: " ; ls -v /proc/$BASHPID/fd

    # Close all but stdio
    SELF=$BASHPID
    FDS=$(find /proc/$SELF/fd -type l -printf '%f\n')
    # The following will even try to close the fd for the find sub
    # shell although it is already closed. (0: stdin, 1: stdout, 2:
    # stderr, 3: find)
    echo -n 'Closing:'
    for n in $FDS ; do
    if ((n > 2)) ; then
        echo -n " $n"
        eval "exec $n>&-"
    fi
    done
    echo

    # List remaining
    echo -n "$BASHPID: " ; ls -v /proc/$BASHPID/fd

    # Do what you want
)

# Original shell has sill all descriptors
echo -n "$BASHPID: " ; ls -v /proc/$BASHPID/fd
Run Code Online (Sandbox Code Playgroud)