コアダンプを有効にするためにダッシュスクリプトで1行のposix dashコマンドを実行する方法は?

コアダンプを有効にするためにダッシュスクリプトで1行のposix dashコマンドを実行する方法は?

無関係な目的のために、posix shでのみ動作するスクリプトを生成する必要があります。

私のスクリプトは、システムがコアダンプの生成を許可していることを確認し、制限が0に設定されている場合はスクリプトを実行しようとしていますulimit -c unlimited

私は成功せずにスクリプトでこれを試しました。

  1. sh -c "ulimit -c unlimited"
  2. ulimit -c unlimited

私の通常のzsh端末で最初のコマンドを試すと失敗しますが、shを実行すると2番目のコマンドが手動で動作します。

それでは、より大きなposix shスクリプト内に配置するには、これらのコマンドを実行してコアダンプを有効にしますか?

ベストアンサー1

ulimit実際に定義されていない基準、それはちょうど知っているように思われるので、標準がどのようなulimit -f問題を避けると期待することはできません。

しかし、Bash、Dash(Debian)、Busybox、zsh、ksh、yashなど、ulimit -c unlimited私が試したすべてのシェルで動作します。/bin/shBSDの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

もちろん、システムにコアファイルの作成に影響を与える可能性がある他の要因があります。

おすすめ記事