無関係な目的のために、posix shでのみ動作するスクリプトを生成する必要があります。
私のスクリプトは、システムがコアダンプの生成を許可していることを確認し、制限が0に設定されている場合はスクリプトを実行しようとしていますulimit -c unlimited
。
私は成功せずにスクリプトでこれを試しました。
sh -c "ulimit -c unlimited"
ulimit -c unlimited
私の通常のzsh端末で最初のコマンドを試すと失敗しますが、shを実行すると2番目のコマンドが手動で動作します。
それでは、より大きなposix shスクリプト内に配置するには、これらのコマンドを実行してコアダンプを有効にしますか?
答え1
ulimit
実際に定義されていない基準、それはちょうど知っているように思われるので、標準がどのようなulimit -f
問題を避けると期待することはできません。
しかし、Bash、Dash(Debian)、Busybox、zsh、ksh、yashなど、ulimit -c unlimited
私が試したすべてのシェルで動作します。/bin/sh
BSDのkshバリエーションについてはわかりません。
設定されたリソース制限はulimit
プロセスから子プロセスに継承されるため、スクリプトの設定はスクリプトによって開始されたプロセスにのみ影響します。つまり、これはsh -c "ulimit -c unlimited"
役に立ちません。制限を設定した直後に終了する特定のシェルの制限のみが変更されます。
もちろん、制限設定が失敗する可能性があります。たとえば、ハード制限が設定されて制限を上げることができない場合があります。したがって、ulimit
通話に対していくつかのエラーチェックを実行できます。
if ! ulimit -c unlimited; then
echo "error: something went wrong when setting core dump limit" >&2
exit 1
fi
# do something here that might dump core
これはほとんどのシェルで機能しますが、zshではulimit
成功ステータスが常に返され、失敗してもエラーは発生しません(異常)。したがって、zshは制限を読み、正しく設定されていることを確認する必要があります。たとえば、次のようになります。
ulimit -c unlimited
if [ "$(ulimit -c)" != unlimited ]; then
echo "error: core dump limit wasn't set" >&2
exit 1
fi
もちろん、システムにコアファイルの作成に影響を与える可能性がある他の要因があります。
答え2
現在のPOSIXテキストがリストされます。
ulimit [-H|-S] -a
ulimit [-H|-S] [-c|-d|-f|-n|-s|-t|-v] [newlimit]
したがって、POSIX規格には以下が含まれていますulimit -c corelimit
。
関連する制限は呼び出しによって制御され、setrlimit()
呼び出しはsetrlimit()
呼び出しプロセスまたはそのプロセスのサブ制限のみを制御するという事実を見逃した可能性があります。
サブシェルを呼び出そうとするため、ulimit ...
これらの設定はそのサブシェルと潜在的なサブシェルにのみ適用されます。
つまり、ulimit
現在の作業環境で設定を有効にするには、現在のシェルを呼び出す必要があります。ショートカットが好きな場合は、そのコマンドのショートカットを設定したりスクリプトをalias
作成したりできますが、dot
作業シェルに適用するには、そのスクリプトをコマンド(.)として呼び出す必要があります。