web-dev-qa-db-ja.com

以前のターミナルからナノプロセスを回復できますか?

変更が保存されていないnanoセッション中にシステムがクラッシュしました。

SSH経由で再度ログインすると、psを実行してもnanoプロセスが実行されていることがわかります。

davidparks21@devdb1:/opt/frugg_batch$ ps -ef | grep nano
1001     31714 29481  0 18:32 pts/0    00:00:00 nano frugg_batch_processing
1001     31905 31759  0 19:16 pts/1    00:00:00 grep --color=auto nano
davidparks21@devdb1:/opt/frugg_batch$

新しいターミナルでnanoプロセスを自分の制御下に戻す方法はありますか?

または、リモートで(新しい端末から)保存するように強制する方法はありますか?

7
davidparks21

Nanoのマニュアルページを読んで、いくつかの検索を行ったところ、次のことがわかりました。

Nanoは、バッファーを緊急ファイルにダンプしようとする場合があります。これは主に、nanoがSIGHUPまたはSIGTERMを受信した場合、またはメモリが不足した場合に発生します。バッファに名前がない場合は、nano.saveという名前のファイルにバッファを書き込むか、現在のファイル名に「.save」というサフィックスを追加します。その名前の緊急ファイルが現在のディレクトリにすでに存在する場合、それを一意にするために、現在のファイル名に「.save」と番号(たとえば「.save.1」)を追加します。マルチバッファモードでは、nanoは開いているすべてのバッファをそれぞれの緊急ファイルに書き込みます。

したがって、おそらくすでにそのようなファイルがシステムのどこかに待機している必要があります。

find /likely/path -mtime -1 -print | egrep -i '\.save$|\.save\.[1-90]*$'

(/可能性が高い/パスは最初にnanoを起動した場所であり、次に他のそのような「可能性のある」場所であり、最後の手段として:/(もちろん、最後のfindコマンドをrootとして起動するか、シェルのSTDERRリダイレクトを使用してリダイレクトできる多くのエラー出力を予期します)

-mtime -1は「1日以内」を示し、ファイルをいつ編集したか、またいつ読んだかに応じて、値を-2または-3に変更することができます。

Nanoがまだそのようなファイルを書き込んでいない場合は、SIGHUPシグナルを送信して、強制的にそのように強制することができます(参照: http://en.wikipedia.org/wiki/Unix_signal#POSIX_signals

次に、もう一度検索を実行してそのファイルを探します...

そして最後に、最後の手段として、探しているテキストの一部を/ proc/kmemでgreppingして遊ぶこともできますが、これには表示されている内容をサニタイズするためにいくつかの予防策が必要であり、簡単ではありません。または、最初に(メモリと同じ大きさの)ファイルにddします。

7
Olivier Dulac

したがって、これはオプションではないかもしれませんが、私はリブートコマンドをボックスに送信しました。オンラインに戻ったとき、Viola- file.py.saveがディレクトリに置かれました。

3
Kevin Rutan

@Oliver Dulacで述べたように機能しますが、一部の状況では、バッファーをファイルにダンプしてNanoが解釈し、ユーザーコマンドから待機し続けるだけですが、再起動せずにさらに多くのオプションがあります。

pkill -SIGHUP -e nano
pkill -SIGTERM -e nano
pkill -SIGILL -e nano

しかし、プログラムは上記の3つの信号を無視することを選択できるため、上記の順序でそれらを試してから、ファイルが作成されたかどうかを確認し、機能しない場合は、再起動の実行と同じ信号を試してください(SIGTERMの後に送信されます)。

pkill -SIGKILL -e nano

これらはプログラムへのシグナルであることを覚えておいてください。一番上のものは実行中のプログラムによって解釈され、無視されます。最後のものです。

  • SIGHUPは、プログラムがSSH経由で非常に一般的なものを実行していた端末であることをプログラムに伝えます
  • SIGTERMは、プログラムを適切に閉じるためのユーザーシグナルですが、プログラムが何かを必要とする場合(つまり、ファイルにバッファーを保存する必要がある場合)は無視できます。
  • SIGILLは、プログラムが不適切な動作を行っているため終了する必要があることをプログラムに通知しますが、上記のように解釈して無視することはできます。
  • SIGKILLは最後の警告です。システムはすぐにプログラムを強制終了するため、プログラムが解釈して最善を尽くします。
0
Thiago Conrado