1

今日、私が cron でコア ダンプを検出して警告しようとしているものは、実際には誤ったアサーション (フォアグラウンドまたはバックグラウンドのいずれかでコマンドラインで実行すると通常はコア ダンプするもの) にヒットしましたが、コアはダンプされませんでした。この簡単なテストを書きました:

int main
{
sleep(3);
assert(false);
}

コンパイルして実行すると、常にコアダンプが発生します。しかし、それをcrontabに置くと、代わりにcronデーモンから次のようなメールが届きました。

rocket: main.cpp:10: int main(int, char**): Assertion `false' failed.
/bin/sh: line 1: 32448 Aborted                 ./rocket

また、コア ファイルが に配置されたことはありません/cores。これはなぜですか、どうすればコアを入手できますか?

4

1 に答える 1

6

クラッシュ時にコア ファイルを生成するには、現在の環境でコア ダンプを有効にする必要があります。シェルから、これは ulimit を使用して実行できます。

ulimit -c unlimited

これは、「コア ダンプの最大サイズを無制限に設定する」ことを意味します。システムはおそらく対話型シェルでこれを行うように構成されていますが、cron ジョブでは構成されていません。cron ジョブから実行するには、この制限を変更する必要があります。cron ジョブが他のプログラムを呼び出すシェル スクリプトである場合は、ulimit上記のように呼び出すことができます。一方、ジョブが実行可能ファイルの場合は、ラッパーを作成して実行できます。

#!/bin/bash
ulimit -c unlimited
exec "$@"

もう 1 つのオプションは、setrlimit関数を使用して制限自体を設定するようにプログラムを変更することです。

コアが作業ディレクトリではなく /cores にある理由について: ディストリビューションがコア パターンを調整している可能性があり、コア ファイルを処理して /cores に配置するプログラムを使用している可能性があります。

于 2012-09-08T09:58:16.717 に答える