コアダンプを有効にするためにダッシュスクリプトで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

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

答え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作業シェルに適用するには、そのスクリプトをコマンド(.)として呼び出す必要があります。

関連情報