使用shell脚本杀死vim进程后,会留下.swp文件。

6
我开发了一个脚本,它可以终止所有正在处理xxx.log文件的'vim'进程:
ps -ef|grep vim|grep xxx.log|awk '{print $2}'|xargs kill -9

然而,每个被中止的vim实例都会留下.swp(交换)文件。

我该如何在同一个脚本中删除交换文件,或者有其他一些简短的解决方案而无需搜索交换位置等?


pgrepps -ef|grep vim 的正确方式。此外,fuser 是查找打开文件的进程的更好方法。(尽管您必须在交换文件上调用 fuser,因为 VIM 并不总是一直保持编辑文件处于打开状态。)lsof -p <pid> | grep REG | grep xxx.log 是另一种选择。 - Dummy00001
你读过 kill(2)signal(7) 页面上关于 SIGKILL 信号的内容吗?SIGKILL 不允许进程安装自定义信号处理程序,因此它总是在不给程序关闭文件、删除临时文件等机会的情况下杀死程序。尝试另一个信号(值为15的 SIGTERM),尝试使用 kill -15(或者只是 kill,因为它是默认值)而不是 kill -9。顺便问一下,你在哪里读到有关信号和 -9 特殊值的内容(你没有全部阅读)? - Luis Colorado
在另一方面,如果你rm.swp文件,则会破坏恢复这些文件的可能性。那是一个危险的事情。 - Luis Colorado
3个回答

14

kill命令中的 -9 去掉; 这会向Vim发送TERM(终止)信号,使其清理并删除交换文件(至少在Ubuntu上是这样的)。

使用-9 / KILL命令,您不会给该进程清理的机会。这只应该用于绝对必要的情况下(例如,当进程挂起或陷入无限循环并且不再响应外部信号时)。


谢谢!如果这解决了您的问题,请通过点击旁边的复选标记接受答案。 - Ingo Karkat
@Assafbaruch,但请仔细阅读整个内容。当你听说SIGKILL或别名-9时,你必须阅读最后的注释,它表示它不允许进程正常完成,因此如果你读了这个并这样做了,几个月后你会再次提出问题。 - Luis Colorado

2

由于交换文件包含您删除的名称,因此您也应该能够通过适当的操作找到它。

然而,像 vim 这样的交互式编辑器被强制关闭听起来很不对。您真的应该考虑不要这样做。在什么情况下才需要这样做呢?


从日志文件中提取一些信息。但是当一个文件被像vim/less这样的其他进程打开时,脚本会打印有关这些文件的错误: main.log.2015-04-15.1246.gz:意外的文件结尾。 - Asfbar

2
您可以添加

标签。

set noswapfile

将以下内容添加到您的vimrc文件中,这将使交换文件不会被创建。

是的,但这也禁用了从崩溃中恢复并且失去您的编辑的可能性。 - Luis Colorado

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接