クラスタ実行可能ファイルを使用するいくつかのスクリプトがあります。良い結果。問題は、このスクリプトが別のスクリプトを呼び出すときにバックグラウンドプロセスを生成することです。この場合、バックグラウンドプロセスはシステム動作であるファイルロックのファイルハンドルを継承します。私はラッパーとして使用でき、特にファイルロックの場合は、不要なハンドルをすべて閉じることができるツールを探しています。
私の考えでは、メインプロセスだけが2回実行されないように保護する必要があります。私はこれが一般的な状況ではないことを知っています。通常、すべての子はファイルをロックされたままにする必要がありますが、この場合は機能しません。
今、私は上記の基本コードでいくつかのラッパーを使用していくつかの回避策を使用していますが、いくつかのバイナリラッパーを使用することを好みます。
パスワード:
#!/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バリアントで実行されます。