我可以从之前的终端恢复纳米进程吗?

我可以从之前的终端恢复纳米进程吗?

当我处于纳米会话中且更改未保存时,我的系统崩溃了。

当我通过 SSH 重新登录时,我看到 nano 进程仍在运行ps

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$

有什么方法可以让我在新的终端中重新控制纳米进程?

或者有什么方法可以强制它远程保存(从我的新终端)?

答案1

阅读 nano 手册页并进行一些搜索后,我发现:

在某些情况下,nano 会尝试将缓冲区转储到紧急文件中。这主要发生在 nano 收到 SIGHUP 或 SIGTERM 或内存不足时。如果缓冲区还没有名称,它会将缓冲区写入名为 nano.save 的文件中,或者在当前文件名中添加“.save”后缀。如果当前目录中已经存在具有该名称的紧急文件,它会在当前文件名中添加“.save”加一个数字(例如“.save.1”)以使其唯一。在多缓冲区模式下,nano 会将所有打开的缓冲区写入其各自的紧急文件。

所以你应该已经在您的系统上的某个地方有这样一个文件在等着您。

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

(/likely/path 首先是您启动 nano 的地方,然后是其他类似的“可能”的地方,最后是最后一个手段:(/当然,以 root 身份启动最后一个 find 命令,否则会出现大量错误输出,您可以使用 shell 的 STDERR 重定向将其重定向出去)

-mtime -1 表示“最多 1 天”,您可能需要将值更改为 -2 或 -3,具体取决于您何时编辑文件以及何时阅读此文件。

如果 nano 尚未写入这样的文件,您可以尝试向它发送 SIGHUP 信号来强制它这样做(参见:http://en.wikipedia.org/wiki/Unix_signal#POSIX_signals

然后,再次运行查找来查找该文件......

最后,最后的手段是,您可以通过 /proc/kmem 来查找您要查找的文本部分,但这需要采取一些预防措施来净化它显示的内容,并且可能并不简单。或者先将其 dd 到一个(与您的内存一样大)文件中。

答案2

它确实像@Oliver Dulac 提到的那样工作,但在某些情况下,nano 不会将缓冲区转储到文件中,而是解释并继续等待用户命令。

无需重启,还有更多选项:

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

但是程序可以选择忽略上述 3 个信号,因此按照上述顺序尝试它们,然后检查文件是否已创建,如果不奏效,则尝试 SIGKILL(在 SIGTERM 之后发送):

pkill -SIGKILL -e nano

请记住,SIGHUP、SIGTERM 和 SIGILL 可以被正在运行的程序捕获或忽略,但 SIGKILL 不能。

  • SIGHUP 告诉程序其运行的终端已关闭,这是通过远程命令非常常见的事。
  • SIGTERM 是用户关闭程序的信号,但是如果程序需要某些东西(即,它是否应该保存文件的缓冲区?),则可以忽略它。
  • SIGILL 通知程序它正在执行一些不适当的操作并且应该被关闭,但它仍然能够像上面那样进行解释和忽略;
  • SIGKILL 将导致程序立即关闭,而程序无法做出反应。

答案3

因此,这可能不是您的选择,但我只是向盒子发送了重启命令。当它重新上线时,Viola-file.py.save 被放入目录中。

答案4

这是一个简单的解决方案,使用“fg”命令将作业带到前台:

要查看正在运行的作业,请键入命令“jobs”,然后键入命令“fg <job_id>”并传递要恢复的作业 ID。

例子:

>> jobs
   [1]+ nano somefile.txt

>> fg 1
   ( nano session is restored at this point)

相关内容