删除脚本中不需要的文件锁定

删除脚本中不需要的文件锁定

我有一些使用集群可执行文件的脚本。效果很好。问题是当这个脚本调用另一个脚本时,它会创建后台进程。在这种情况下,后台进程继承文件锁定的文件句柄,这是系统行为。我正在寻找任何可以用作包装器并关闭所有不需要的句柄的工具,特别是对于文件锁。

在我看来,只有主进程才应该受到保护,以免运行两次。我知道这是不典型的情况。通常所有孩子都应该完成离开文件锁定,但在这种情况下这是行不通的。

现在我使用一些解决方法,使用一些带有上面主代码的包装器,但我更喜欢使用一些二进制包装器。

代码:

#!/bin/bash
for fd in $(ls /proc/$$/fd); do
case "$fd" in
0|1|2|255)
    ;;
*)
eval "exec $fd>&-"
    ;;
    esac
done
exec $1 $2 $3 $4 $5 $6 $7 $8 $9

答案1

你的剧本看起来足够好。只需要一些改进:

#!/bin/bash
shopt -s nullglob
for fd in "/proc/$$/fd/"*; do
    fd=${fd##*/}
    case "$fd" in
    0|1|2|255)
        ;;
    *)
        eval "exec $fd>&-"
        ;;
    esac
done
exec "$@"
  • nullglob如果未找到文件,则可防止模式自行呈现。
  • 借助${v##pat}参数替换方法进行通配或文件名扩展就足够了。ls不需要使用。
  • 您可以仅使用"$@"来表示传递给脚本的所有参数。

该脚本保证在没有任何外部依赖的情况下运行,因此它与运行二进制文件一样好。

答案2

您想要运行与其调用者隔离的后台作业。这听起来很像守护进程

不幸的是,没有标准实用程序可以将程序作为守护进程启动。 Debian 及其衍生品提供start-stop-daemon,但不幸的是这不能移植到其他发行版。您可以安装daemonize,它将在大多数 UNIX 变体上运行。

相关内容