无法删除文件 - 仅权限更改 - 为什么?

无法删除文件 - 仅权限更改 - 为什么?

我正在尝试删除一个文件,虽然它通过 shell 工作正常,但当我从另一个程序调用我的脚本时,它不会删除该文件,而只是将权限更改为奇怪的内容:

$ touch example.txt
$ ls -la example.txt
-rw-r--r--  1 user users 0 Mar 24 21:49 example.txt
$ rm example.txt
$ ls -la example.txt
-r-S--S---  1 user users 0 Mar 24 21:49 example.txt

我尝试运行该rm命令和该mv命令,如果我将mv文件复制到不同的文件系统(通过复制文件然后删除源来工作),我会得到相同的结果。权限并不总是相同的 - 以下是我所看到的一些示例:

-r-S--S--T
-r-S--S---
-r-S-----T
------S--T

什么可能导致rm命令拒绝删除文件而只更改权限,但每次都随机更改权限?

如果我rm从一个新的 shell 运行该命令,那么它可以正常工作,但我想从一个使用exec().

显然,如果它在正常 shell 中工作但在 shell 内失败,则问题与执行环境有关exec(),但我什至不知道从哪里开始寻找。所有内容都以同一用户身份在同一文件夹中运行。

任何人都可以提供有关如何导致这种行为发生的任何提示,或者从哪里开始寻找到底发生了什么?

答案1

好吧,刚刚意识到发生了什么事。事实证明,该程序正在exec()后台运行该任务,并且当运行有问题的mv或 时,较早的命令仍在运行并对该文件进行操作。rm

所以发生的事情是这样的:

  1. 第一个程序打开文件并开始读取它。
  2. 有问题的命令mvrm命令运行,正常删除文件。
  3. 第一个程序重新创建该文件并将其更改写出。

由于该程序被设计为覆盖它正在处理的文件,因此当它打开文件进行写入时,它没有提供任何权限,并希望重用现有的权限。但由于文件在此过程中已被删除,因此会使用内存中恰好存在的任意随机数来创建一个新文件,用于指定文件权限的未使用参数。

更改进程,以便在第一个命令完成之前不会运行第二个命令,从而解决了问题。

相关内容