スクリプト内で呼び出すときにulimit -nが機能しないのはなぜですか?

スクリプト内で呼び出すときにulimit -nが機能しないのはなぜですか?

これはとても奇妙です。私の設定でこれを試していますulimit60000startup.sh

#!/bin/bash

ulimit -n 60000
echo "Hello! File Descriptor set"

(755ファイル権限)でこれを行うことができ、./startup.shエコーラインはエラーなく印刷されます。ただし、これを行ってもulimit -n表示されます1024。何が起こっているのでしょうか?

驚くべきことにulimit -n 60000、端末に入力して実行するとulimit -n完璧に動作します。スクリプトでファイル記述子の制限を設定できないのはなぜですか?

Debian 8、64ビット。 OpenVZコンテナ

答え1

これは、制限がシェルスクリプト、つまりbashスクリプトを実行して生成されたシェル(この場合)内に設定されているためです(カーネルは実際にスクリプトをシェルに引数として渡します)。

したがって、スクリプトの実行が完了するとそれ殻も消えました(そして制限的です)。その後、元のシェルに戻ります。

テストするには、ulimit -n内部でスクリプトを実行してください。

答え2

ulimit -nプロセスは、それ自体および子プロセスに対してのみ制限を設定できます。プロセス固有の制限ではなくグローバル制限を設定しようとしています。必要に応じてグローバル制限を設定するには、次のようにsetrlimit()Pythonresource.RLIMIT_NOFILEスクリプトを作成できます。resource基準寸法。

関連情報