我有一些使用集群可执行文件的脚本。效果很好。问题是当这个脚本调用另一个脚本时,它会创建后台进程。在这种情况下,后台进程继承文件锁定的文件句柄,这是系统行为。我正在寻找任何可以用作包装器并关闭所有不需要的句柄的工具,特别是对于文件锁。
在我看来,只有主进程才应该受到保护,以免运行两次。我知道这是不典型的情况。通常所有孩子都应该完成离开文件锁定,但在这种情况下这是行不通的。
现在我使用一些解决方法,使用一些带有上面主代码的包装器,但我更喜欢使用一些二进制包装器。
代码:
#!/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 变体上运行。