「スクリプト」コマンドと同様に、ファイルに出力を書きますか?

「スクリプト」コマンドと同様に、ファイルに出力を書きますか?

端末を開く必要がない「スクリプト」に似たものはありますか?

私のプログラムの結果をファイルに保存したいのですが、いくつかの問題があります。リモートで作業する必要がありますが、インターネット接続が悪いです。だから私は通常次を実行します。

./MyProgram.exe > output.txt &

私のプログラムの結果はoutput.txtファイルに保存されます。

ただし、特定のオブジェクトでプログラムを実行すると、「SIGSEGV:Segmentation Fault」エラーが発生します。プログラムが終了しました。大丈夫です。そうなるとわかりました。しかし、プログラムがエラーを引き起こした問題のあるオブジェクトに遭遇する前に、以前のオブジェクトのすべてのデータが失われました。

すべて(問題オブジェクトのない結果とこのエラーを含む)をファイルに書き込むにはどうすればよいですか?

私は試した:

./MyProgram.exe > output.txt 2>&1 &

./MyProgram.exe > output.txt 2> error.txt &

./MyProgram.exe > & error-n-output.txt &

しかし、上記のすべては、プログラムが古いオブジェクトで動作することを知っているにもかかわらず、古いオブジェクトの結果ではなく分割エラーのみを記録します。

scriptまた、次のコマンドを入力してみました。

私の名前@コンピュータ〜/フォルダ$script screen.log
スクリプトが開始され、ファイルは screen.log です。
私の名前@コンピュータ〜/フォルダ$./MyProgram.exe
~~結果と分割エラーが画面に印刷されるため、特定のオブジェクトの結果を記録し、エラーを無視できます~~
私の名前@コンピュータ〜/フォルダ$終了
終了
スクリプトが完了し、ファイルは screen.log です。

画面の内容はすべて screen.log ファイルに書き込まれます。大丈夫かもしれませんが、インターネット接続が良くないため、長時間画面を実行できません。ターミナルを終了する必要がありますが、もちろんプログラムは終了し、「screen.log」ファイルには何も記録されません。

script端末を開く必要がない同様のものがありますか?

答え1

nohupたぶんそれはあなたが望むものかもしれません。nohup目的は、「コマンドを実行して破棄信号を無視すること」です。つまり、何らかの理由で(もちろん、ホストの競合、シャットダウン、または再起動を除く)、シリアル接続などの接続が失われても、プログラムは引き続き実行されますsshtelnet

すべての出力がファイルにリダイレクトされるため、バックnohupグラウンドで(を使用して)-edコマンドを実行することもできます。&

たとえば、

nohup MyProgram.exe &

デフォルトでは、出力はまたは./nohup.outに保存されますが、~/nohup.out必要に応じて他のファイルにリダイレクトできます。マニュアルページから:

標準入力が端末の場合は、読み取れないファイルにリダイレクトします。標準出力が端末の場合はnohup.out可能であれば出力を追加し、$HOME/nohup.outそれ以外の場合は出力を追加してください。標準エラーが端末の場合は標準出力にリダイレクトします。出力をFILEに保存するにはnohup COMMAND > FILE

nohupユーザー入力を必要としない非対話型プログラムに最適です。

ユーザーと直接対話するプログラム(ncursesアプリケーションなど)を実行する必要がある場合は、GNUなどのターミナルマルチプレクサを使用してください。画面またはマルチプレクサまたは画面または代わりに同様のものnohup

ターミナルマルチプレクサは、プログラムが中断信号の影響を受けないようにするだけでなく、切断後に再度ログインしたときに同じシェルセッション(および実行中のプログラム)に再接続できるようにします。単一の接続を介して複数のシェルセッションを有効にすることもできます(たとえば、sshを介してリモートシステムに接続して実行すると、screen必要に応じて必要な数のシェル「ウィンドウ」を作成、削除、および切り替えることができます)。

ちなみに、これらのプログラムはすべて標準シェルを提供するので、scriptその中で実行することを選択できます。

このプログラムのホームページにリンクしましたが、インストール用にコンパイルする必要はありません。ほとんどの(すべて?)Linuxディストリビューション、FreeBSD、Mac OS X、Solarisなど。

答え2

標準出力に追加するには、>>次の代わりに使用できます>

./MyProgram.exe >> output.txt 2> error.txt &

これにより、出力が毎回上書きされるのを防ぎます。

これは明らかに、セッションが閉じられたときにプロセスが終了するのを防ぎません。可能であれば、nohupそれを使用してプログラムを開始する必要があります。これにより、セッションが閉じられてもプログラムを実行し続けることができます。

答え3

コマンドを試す

stdbuf -oL ./MyProgram.exe > output.txt

デフォルトでは、プログラムの標準出力は、出力が端末の場合はラインバッファリングされますが、出力が通常のファイルの場合は4kBチャンクにバッファリングされます(output.txtにリダイレクトしたため、今の場合です)。

これは、printf()などの標準stdio関数が実際にデータを書き込む前に最大4kBのデータを収集することを意味します。ユーティリティがクラッシュすると(残念ながら)、まだ作成されていない最後のブロックは失われます。

stdbuf -oL出力が通常のファイルに移動しても、標準出力がラインバッファリングされるように設定します。

(間違いなく最もきれいな解決策は、アプリケーションがクラッシュしないように修正することです。)

nohupこれを、またはscreen他の回答に示すようにさらに組み合わせることができます。

答え4

以下を試してください。

program.exe &> /temp/output.log ;
# OR #
program.exe &> /temp/output.log &

場合によっては、次の変更を見続けたい場合があります。

watch cat /temp/output.log
# OR #
watch --diff cat /temp/output.log

または同様に:

watch tail /temp/output.log
# OR #
watch --diff tail /temp/output.log

正確に何をしたいのかを判断するのは少し難しいですが、次のユーティリティが役に立ちます。

script
# OR #
asciinema

他のすべての方法が失敗した場合は、デバッガ、デコンパイラ、逆アセンブラなどを使用することを検討する必要があります。

どのように過ごすかを教えてください。それに応じてこの投稿を調整します。

関連情報