在我的主目录中有一个名为“GNUstep”的目录。因为我不使用 GNUstep,所以我想删除这个目录,但是当我这样做时它会不断被创建:
$ tree GNUstep
GNUstep
└── Defaults
1 directory, 0 files
$ rm -rf GNUstep
$ tree GNUstep # executed after a few seconds
GNUstep
└── Defaults
1 directory, 0 files
我已经删除了所有相关的包,所以apt search gnustep | grep installed
现在什么都没有显示。我也做了apt autoremove
没有任何用处。我使用 Lubuntu 16.04。
如何确定每次删除目录时哪个进程创建目录,以及如何防止它这样做?
这不是以下内容的重复:
- 这个 GNUstep 文件夹是什么?– 除了“只是删除它”(我做了)之外,它不包含有关如何永久删除目录的信息。
- 如何卸载 GNUStep?– 我已经这样做了,但并没有解决问题。
这表明:
作为一种解决方法,您可以在 /etc/GNUstep/GNUstep.conf 文件中更改 GNUSTEP_USER_DEFAULTS_DIR 的值。
不幸的是,我的机器上没有这样的文件,甚至不/etc/GNUstep
存在。
这里有两个主要考虑因素:
1. 查找已删除的内容和您仍然拥有的内容,并删除软件包。
跟踪您已采取哪些操作(例如您运行了哪些命令)来删除软件包以及已删除哪些软件包很有用。但即使没有,您也可以查看日志文件
/var/log/apt/term.log
、/var/log/apt/history.log
和/var/log/dpkg.log
. 特别是对于最近的软件包删除,很容易看到删除的内容。如果您通过在终端中运行命令来执行删除,那么它们也应该在您的 shell 的历史记录中,在 Bash 中您可以使用history
命令检查(运行help history
以获取详细信息),尽管这只会显示您运行的命令,而不是它们的效果.要搜索包含特定单词的已安装包,例如
gnustep
,我建议使用:(当单词不是
gnustep
时,用它替换gnustep
。)请注意,虽然
apt
'slist
动作支持*
作为通配符,但remove
andpurge
动作不支持。相反,他们将其视为正则表达式中的元字符(就像这样),人们有时会删除比他们预期的要多得多的包,并且不得不修复他们的系统。通常最好只传递您要删除的特定包的名称。但是,例如,如果您需要删除名称以 开头的所有包,那么您可以运行:grep
libgnustep
(要删除 conffiles 也可以使用
purge
代替remove
。)2. 卸载的程序和库即使被删除也可能继续运行。
除非在您卸载软件包时运行的删除脚本包含用于终止它提供的程序的任何正在运行的实例的命令,除了那些提供后台服务的程序之外,这种情况很少见,或者终止使用它的库的其他程序提供,这是闻所未闻的,即使在文件被取消删除后,您卸载的软件包提供的软件可能仍在运行。
一个文件可能有一个或多个硬链接,即文件名。(硬链接不应与符号链接混淆。)当所有这些都被删除时,文件实际上被删除:它的inode条目被删除,并且磁盘上存储文件数据的存储位置被允许重用。除非文件当前已打开。然后文件被保留,直到它被关闭,这发生在使用它的程序故意关闭文件或退出时。同样,如果您删除的文件是一个程序,该程序将继续运行,该文件将保留在磁盘上,直到它退出。
因此,当您卸载提供程序但程序正在运行的程序包时,删除该程序不会自动退出程序,也不一定会干扰其操作(尽管它可能会,如果它稍后打开它预期存在的其他文件)。并且当您卸载提供库但某些程序仍在使用该库的软件包时,该库暂时继续存在于磁盘上并且使用它的程序继续运行。
重新启动足以导致文件被删除,因为正在运行的进程无法在重新启动后继续存在。注销并重新登录实际上可能是不够的,但通常就足够了。但是,如果您不能重新启动,或者不想重新启动,那么您可以尝试找出正在运行的程序并退出它。在许多情况下,包括您遇到的情况,这是最好的方法,因为它更快并且几乎与重新启动一样容易。但是,如果您无法找到该过程或不想打扰,重新启动将解决它。
当GNUstep程序运行时,它可能会读取和写入
~/GNUstep
,如果发现它不存在,它可能会重新创建它。尽管您可以尝试grep
在正在运行的进程列表中查找特定的 GNUstep 相关文本(见下文),但我建议采用更通用的方法:检查 的输出
ps x
。您也可以使用a
标志ps ax
-- -- 来显示所有用户的进程,但我建议在开始时忽略它,因为该进程可能确实属于您,因此列出所有内容可能只会给您带来更大的干草堆。由于完整的命令行有时很有用,我建议运行ps x --columns=100000
. 或者只是 runps | cat
,因为ps
当它的输出不是终端时不会截断。这是“无用使用猫”毕竟不是那么无用的几种情况之一。(你实际上不太可能得到十万个字符长的行——这只是一个很大的数字,以确保行不会被截断。再增加一个数量级就可以
ps
这么说fix bigness error
,这就是我选择 100000 的原因.)检查
pstree
。这默认显示所有进程,并直观地显示它们的父子关系。如果事实证明该进程毕竟属于另一个用户,或者如果它属于您但您在查看ps
.当您运行该
ps
命令时(读者:此答案是在根据评论解决问题后编写的),您发现仍在运行的程序是:我上面描述的方法不是特定于 GNUstep 的——除非你正在运行的 GNUstep 应用程序可能以你的身份运行,而不是像 root 这样的其他用户,但这是一种常见的情况,并不是真正特定于 GNUstep。但是,GNUstep 程序的典型路径名包含一个
.app
目录,因为它们通常作为.app
容器提供。即使文件被删除,ps
仍然显示调用它的名称,通常是绝对路径。因此,正在寻找 GNUstep 程序的用户,特别是如果他们正在运行许多其他程序并且不想检查 的输出
ps x
,可以尝试通过运行来找到它:(
.
在正则表达式中匹配任何字符。匹配文字点的一种方法是[.]
,虽然还有其他方法,但我选择了这种方法,因为它会导致您的grep
命令行不包含.app
,因此不会虚假地包含在结果中.)