質問: ### 前提・実現したいこと お世話になっております。 CentOS6.7+Calibre(フリーソフト)での、セグメンテーションフォルトのファイルリダイレクトについて CentOSの環境で、Calibreを利用したdocx->epub変換を行っています。 docxファイルの内容によっては、セグメンテーションフォルトが起こるのですが、このときにコマンドに表示されるセグメンテーションフォルト発生のメッセージをリダイレクトさせたいと考えています。 標準出力や標準エラーと違い、どうしてもセグメンテーションフォルトをファイルリダイレクトさせることができません。 ネット検索等しましたが、有用な情報は得られませんでした。 ### 発生している問題・エラーメッセージ Calibreでのdocx->epub変換時に、セグメンテーションフォルトのメッセージを、指定したファイルにリダイレクトすることができません。 ### 試したこと 標準出力や標準エラーをリダイレクトさせる方法ではうまくいきませんでした。 ebook-convert input.docx output.docx 2> file.txt 標準エラー出力の内容がfile.txtへ ebook-convert input.docx output.docx 1> file.txt 標準出力の内容がfile.txtへ ebook-convert input.docx output.docx > file.txt 2>&1 標準出力と標準エラーがfile.txtへ いずれの場合も、セグメンテーションフォルト発生を示すメッセージだけが、コマンド上に表示され、リダイレクトされませんでした。
回答: それは原理的に無理だと思います。 というのは、標準入出力や標準エラー出力、そしてリダイレクトというのはシェル(インターフェース)の機能だからです。 しかし、コンピュータのメモリーはカーネルが直に管理していて、セグメンテーションフォルトを犯した(禁止領域にアクセスした)プリセスに対しては直接 `SIGSEGV` シグナルを送って停止させてしまいます。 ですから、シェル経由でエラーメッセージが表示された時点では、メッセージをリダイレクトしようとしたプロセスは終了してしまっているので、いかなる手段を使ってもリダイレクトする事はできません。 ではどうするかと言えば、一般論になりますが、カーネルから送られて来た `SIGSEGV` シグナル自体を補足してエラーハンドリングを行います。 ですから、シグナルによる割り込みを制御出来る処理系(Cやシェルスクリプト)なら対応可能ですが、それ以外だと難しいと思います。 具体的な方法については下記ページなどを参考にしてみてください。 シグナルと trap コマンド SIGSEGVをキャッチし、なおかつそこから元の処理を継続する。