複数のシステムがNFSを介して同じファイルシステムを共有する設定があります。キューシステムを使用すると、処理ジョブをさまざまな属性を持つ複数のシステムに送信できます。
時にはジョブが中断され、コアファイル(名前など)が残りますcore.1234
。
そのコアファイルを生成したホストを見つける方法はありますか?ホスト名は何ですか?
(差がある場合は、Linux 64ビットに適用されます。)
答え1
中非常に低い周波数システムでは、コアファイルはほぼ確実に有効なELFファイルです。
$ readelf -a core
ELF Header:
Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
Class: ELF32
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: CORE (Core file)
Machine: Intel 80386
[...]
デバッガがそのメソッドを見つけることができるように、プラットフォーム固有の「説明」の数は説明セクションに追加されます。たとえば、Solarisの場合コア(4)NT_UTSNAME
、システムコールのデータ構造を含む構造を表示できますuname(2)
。elfdump -n
読み方ですが、私が知っている限り、Solarisはこれを行う唯一のオペレーティングシステムです(Solaris 11だけが期待どおりにelfdump
機能すると思います)。
単純だが少し退屈で保証されない方法は、コアダンプ環境から変数(一部の起動スクリプトとシェルによって設定され、少なくとも設定されている)を取得しようとするHOST
ことです。 :を使用してこれを実行できますが、元のバイナリが必要です。HOSTNAME
bash
HOSTNAME
gdb
$ gdb /usr/bin/sleep core
[... snip ...]
(gdb) print (char ***) &environ
$1 = (char ***) 0x600bf8
(gdb) print $1[0][0]@10
$2 = {0x7fffffffd9c9 "HOST=myhostname", 0x7fffffffd9d9 "TERM=screen",
0x7fffffffd9e5 "SHELL=/bin/csh",
[...]
これenviron
シンボルから文字列の塊を印刷します。。これはひどいハッキングですが、うまくいくかもしれませんstrings | grep HOSTNAME=
。
だから短い答えは」そのコアファイルを生成したホストを見つける方法はありますか?「Linuxでは簡単でも信頼もできません。
FWIW、Linuxの関連するコアダンプコードはにあり、fs/binfmt_elf.c
以下を介して追加の「コメント」を可能にするフックがあります。ARCH_HAVE_EXTRA_ELF_NOTES
、現在PowerPCでのみ利用可能です。 )
より良い計画はsysctlを使用したコアファイル名の設定@jlliagreが提案したように、各クライアントで次のことを行います。
sysctl kernel.core_pattern="%h-%t-%e.core"
(ここでsysctl
言及されているものは同じで、変更が記録される可能性があり、* BSDシステムでも機能するため/proc
好ましい。)sysctl
/etc/sysctl.conf
答え2
strings core.1234
実行すると、ホスト名がどこかに表示されることを確認できます。一部のオペレーティングシステム(Solarisなど)はホスト名をコアヘッダに入れますが、私が知っている限りLinuxではこれを実行しないため、このstrings
方法は信頼できません。
より良いアプローチは、設定ファイルまたはいくつかのディストリビューション設定(実行ファイルを参照している場合)を介してクライアントを設定し、NFS
そのホスト名をコアファイル名に入れることです。/proc/sys/kernel/core_pattern
core_pattern