我有一个非常奇怪的问题。在我使用 Hudson 部署的一个盒子上,工作副本文件夹(基本上是一个 SVN 结账)每晚都会不断被删除。不是一个大问题;大多是奇怪和烦人的。因此,每天早上,我都必须执行完整的结帐而不是更新/切换。据我所知,这不是 Hudson 的配置问题,我检查了每个 crontab 文件以确认不是这样。
在 Linux 中,是否有一个 bash 脚本或一些命令行魔法来监视一个文件夹,保存有关它何时被删除以及谁删除它的历史记录?这样,我可以缩小执行实际删除的范围。
我遇到了类似的事情——我所做的是双重的。首先,我打开了完整的系统记帐——它记录了哪些进程被执行以及何时执行。您可以通过查看父目录的最后一次修改时间来缩小“时间”。
但我认为会计日志显示的细节不够多(进程参数、父进程等——这是在 Solaris 上,您可能会在 Linux 上获得更多日志记录选项)。所以我最终做的是重命名“rm”,并在记录输入参数、调用它的进程以及谁拥有调用进程之后,编写一个名为“rm”的 shell 脚本来调用真实的脚本。
如果一个进程正在调用 unlink 系统调用而不是 rm,那么您可能不得不求助于获取 C 库的源代码并将类似的日志记录功能添加到 unlink 调用。
我不确定这个问题应该被标记为“bash”。许多事情可能会删除这个文件夹,而 bash 不包含任何自己的代码来实际删除内容。
跟踪正在发生的事情的一种选择是使其无法删除目录,然后查看 Hudson(或其他地方)中的某些内容是否抱怨错误。您可以在父文件夹或其中的任何文件上设置“不可变”标志,删除将失败。
在 BSD (FreeBSD/NetBSD/etc) 中,使用:
sudo chflags schg /path/to/directory_or_file
在 Linux 中,使用:
sudo chattr +i /path/to/directory_or_file
现在,确保你实际上得到了(而不是过滤或传递空值)你所有的 root 和 cron 消息,在 Hudson 中调高调试级别(如果有的话,我不知道),然后观察看看会发生什么.
请注意,如果您将不可变标志(或 schg)添加到文件夹,则不会保护子文件夹的内容。它只会使您无法删除该目录,或者向其中添加或删除文件。
[ghoti@pc ~]$ mkdir zzz zzz/foo
[ghoti@pc ~]$ touch zzz/bar
[ghoti@pc ~]$ sudo chflags schg zzz
[ghoti@pc ~]$ touch zzz/baz
touch: zzz/baz: Operation not permitted
[ghoti@pc ~]$ touch zzz/foo/baz
[ghoti@pc ~]$
您可能会遇到 JENKINS-8880,其中节点的workspace/目录中的自定义工作区每晚都会被删除。修复方法是升级到 1.427(或更高版本),或者将自定义工作区放在工作区/目录之外。